【问题标题】:Ignore whitespace in Regex expression and match忽略正则表达式中的空格并匹配
【发布时间】:2018-11-23 06:48:06
【问题描述】:

我需要从损坏的 Json 中读取一些无法解析为对象的数据。我需要使用正则表达式来获得这个。我还有最后一件事给我带来了麻烦。这是我正在使用的 Json 的 sn-p。

price: "1129.0",
quantity: "0",
rating: "4.9",
ratingCount: "127",

我想提取4.9。为此,我有以下正则表达式。

(?<=rating: \")([\s\S]*?)(?=\")

我遇到的问题是有时 Json 在冒号之间缺少空格。

price:"1129.0",
quantity:"0",
rating:"4.9",
ratingCount:"127",

我无法修改源内容,因为需要在某些节点中保留空白。我试图超级具体并使用以下

(?<=rating: \")([\S*\s*][0-9.](.*?))(?=\")

这可行,但再一次,如果我有缺少空格的 json,它就不起作用。如果我删除规则本身中的空格,它也不起作用。我需要能够使用一个不关心开始和结束块中是否有任何空格的规则。只要空格以外的所有内容都匹配,就很好。

我正在使用 C# 来执行这些正则表达式规则,并且一直在使用 https://regexr.com/3qvlp 来测试这些规则。

【问题讨论】:

  • 试试(?&lt;=rating:\s*\").*(?=\",)。在此处查看现场演示regex101.com/r/kgIDGR/1
  • 您正在使用不需要的断言。这是编写正则表达式的一种非常糟糕的方式。它很慢,它有可能有问题的陷阱。由于您无论如何都在捕获,所以只需放弃断言。 rating\s*:\s*"([^"]*)"

标签: c# json regex


【解决方案1】:

(?&lt;=rating:\s*\")([\S*\s*][0-9.](.*?))(?=\") 应该可以工作。它在可变长度的 " 之前添加一个可选的空格。如果您只想要一个或零,那么(?&lt;=rating:\s{0,1}\")([\S*\s*][0-9.](.*?))(?=\") 将起作用。

【讨论】:

  • 感谢您的回复,我已经尝试过了,但它似乎不起作用regexr.com/3qvlp
  • 有趣,我有完全相同的东西,它对我有用。我还在 c# 代码中对其进行了测试,它对我有用。 regexr.com/3r0d1
  • regexr 不使用 .net 风格的正则表达式;虽然 .net 版本的正则表达式支持您在此处使用的lookbehinds 中的量词,但它们的版本可能不支持。如果您看到意外的错误,请使用 regexstorm 测试 .net 正则表达式。
【解决方案2】:

您可以在匹配零个或多个空白字符后的正向查找中添加\s*,并且使用否定字符类[^"]+ 不匹配"

(?&lt;=rating:\s*")[^"]+(?=\")

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2021-05-31
    • 1970-01-01
    • 2021-09-13
    • 2020-08-06
    • 2019-04-13
    相关资源
    最近更新 更多