忽略正则表达式中的空格并匹配

Posted

技术标签:

【中文标题】忽略正则表达式中的空格并匹配【英文标题】: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 来测试这些规则。

【问题讨论】:

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

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

【讨论】:

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

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

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

Demo

【讨论】:

以上是关于忽略正则表达式中的空格并匹配的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 - 查找所有空格并忽略多行字符串中的连字符分隔的单词

Python 松散正则表达式

Python 松散正则表达式

正则表达式

与正则表达式匹配时是不是可以忽略字符串中的字符

正则表达式只允许单词之间有一个空格