问题描述
我正在尝试从GraphQL查询中删除多余的空格和换行符,但 filter 参数中2个双引号之间的数据应保持不变。
这是在我们快速的CDN上接收查询的方式
# input
{"query":"query OpName {\n itemCollection (filter: { text: "aa aa aa",text2: "aa aa"}){\n group { slug\n\n\n\n text text2 } } }"}
# expected output
{"query":"query OpName { itemCollection (filter: { text: "aa aa aa",text2: "aa aa"}){ group { slug text text2 } } }"}
目标是
- 从查询中删除多余的空格
- 两个双引号之间的空格应在graphql查询中保持完整(因为 filter 参数的值将用于匹配数据库中的记录)
我们尝试了以下方法:
-
在fastly docs给出
-
\s+(?=(?:['|%22](?:\\['|%22]|[^'|%22])+['|%22]|[^'|%22])+$)
-
\s+(?=([^"]*"[^"]*")*[^"]*$)
但这似乎不起作用。
解决方法
我建议分3个步骤进行操作:
- 暂时保存
filter
; - 进行替换(删除不需要的空格);
- 重新添加
filter
。
所需的正则表达式变得非常简单(并且我想更快,因为您不需要前瞻或其他技巧)。
替代:
将字符串分成三部分:
- 在
filter
之前; -
filter
; -
filter
之后。
在“ before”和“ after”字符串中进行替换。最后加入零件。
regex for splitting可能看起来像:
(.*?)(filter: {[^}]*})(.*)
使用以下内容重建最终字符串:
removeSpaces(group1) + group2 + removeSpaces(group3)
removeSpaces()
实际上将\s+
替换为
。如果要保留新行(\n
),请用 +
替换
。
我对您的编程语言不是很熟悉,因此我无法提供确切的代码,但是您应该可以理解。