忽略正则表达式中的空格并匹配
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 试试(?<=rating:\s*\").*(?=\",)
。在此处查看现场演示regex101.com/r/kgIDGR/1
您正在使用不需要的断言。这是编写正则表达式的一种非常糟糕的方式。它很慢,它有可能有问题的陷阱。由于您无论如何都在捕获,所以只需放弃断言。 rating\s*:\s*"([^"]*)"
【参考方案1】:
(?<=rating:\s*\")([\S*\s*][0-9.](.*?))(?=\")
应该可以工作。它在可变长度的 " 之前添加一个可选的空格。如果您只想要一个或零,那么(?<=rating:\s0,1\")([\S*\s*][0-9.](.*?))(?=\")
将起作用。
【讨论】:
感谢您的回复,我已经尝试过了,但它似乎不起作用regexr.com/3qvlp 有趣,我有完全相同的东西,它对我有用。我还在 c# 代码中对其进行了测试,它对我有用。 regexr.com/3r0d1 regexr 不使用 .net 风格的正则表达式;虽然 .net 版本的正则表达式支持您在此处使用的lookbehinds 中的量词,但它们的版本可能不支持。如果您看到意外的错误,请使用 regexstorm 测试 .net 正则表达式。【参考方案2】:您可以在匹配零个或多个空白字符后的正向查找中添加\s*
,并且使用否定字符类[^"]+
不匹配"
:
(?<=rating:\s*")[^"]+(?=\")
Demo
【讨论】:
以上是关于忽略正则表达式中的空格并匹配的主要内容,如果未能解决你的问题,请参考以下文章