【问题标题】:Removing whitespaces and newline characters from GraphQL based on condition根据条件从 GraphQL 中删除空格和换行符
【发布时间】:2023-03-11 05:02:01
【问题描述】:

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

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

我们尝试了以下方法:

  • \s+(?=(?:['|%22](?:\\['|%22]|[^'|%22])+['|%22]|[^'|%22])+$)fastly docs 给出
  • \s+(?=([^"]*"[^"]*")*[^"]*$)

但它似乎不起作用。

【问题讨论】:

标签: regex pcre vcl fastly


【解决方案1】:

我建议分三步进行:

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

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


替代方案:

将字符串分成三部分:

  • 之前filter;
  • filter;
  • filter之后。

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


regex for splitting 可能看起来像:

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

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

removeSpaces(group1) + group2 + removeSpaces(group3)

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

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

【讨论】:

  • filter 的参数是 JSON 对象类型,因此它可以有键和值的任意组合。因此,我只关心在删除空格时 JSON 键的值不会失真。
  • 没关系。您将filterfilter: {[^}]*} 隔离开来。只要 JSON 不包含花括号,您就是安全的。顺便说一句,那些有很多空格的字符串的来源是什么?您也许可以在构建字符串之前删除空格,从而节省时间和精力,并提高速度。
  • 过滤器的 JSON 也可能是这样的:{text: "text value", group: {key: "value", arr: ["a", 1]}}。因此,提供的正则表达式不会完全起作用。正则表达式在 PCRE 中。语言是 Varnish - VCL
  • JSON 只有一层花括号,还是可以嵌入任意数量的花括号?
  • 我担心您实际上需要适当的 SQL 和 JSON 解析器。
猜你喜欢
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多