1

我正在尝试从我的 GraphQL 查询中删除额外的空格和换行符,但过滤器参数中两个双引号之间的数据应该保持不变。

以下是我们 fastly 的 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 查询中保持不变(因为过滤器参数的值将用于匹配我们数据库中的记录)

我们尝试了以下方法:

  • \s+(?=(?:['|%22](?:\\['|%22]|[^'|%22])+['|%22]|[^'|%22])+$)快速文档中给出
  • \s+(?=([^"]*"[^"]*")*[^"]*$)

但这似乎不起作用。

4

1 回答 1

0

我建议分三步进行:

  • filter暂时保存;
  • 进行替换(删除不需要的空格);
  • 加回filter.

所需的正则表达式变得非常简单(我猜更快,因为您不需要前瞻或其他技巧)。


选择:

将字符串分成 3 部分:

  • 之前filter
  • filter;
  • 之后filter

在“之前”和“之后”字符串中进行替换。加入最后的部分。


用于拆分的正则表达式可能如下所示:

(.*?)(filter: {[^}]*})(.*)

使用以下内容重建最终字符串:

removeSpaces(group1) + group2 + removeSpaces(group3)

removeSpaces()实际上替换\s+ . 如果要保留新行 ( \n),请替换 + .

我对你的编程语言不是很熟悉,所以我不能提供确切的代码,但你应该能够理解。

于 2020-10-06T12:39:43.147 回答