防止正则表达式在使用可选令牌时变得贪婪



我正在尝试使用regex从不同的字符串中提取信息。

例如,我有以下JSON:

{
"id": 1,
"title": "test", // comment
"cost": "$10",
}

并且希望编写一个正则表达式,将(1(冒号之前的文本、(2(逗号之前的文本,(3(逗号(如果存在(和(4(逗号之后的文本提取到捕获组中。

从逗号不可选开始,我提出了(.*?): (.*?)(,)(.*?)n

这是正确的。但是,我现在尝试通过添加?:(.*?): (.*?)(,?)(.*?)n来修改它,使逗号是可选的。这一点被打破了,通常应该在捕获组2和3中的内容转移到第4组。

如何修改正则表达式以防止这种情况发生?当逗号确实存在时,我希望修改后的版本与原始的非可选版本功能相同,当逗号不存在时,将冒号后的所有文本移到第2组。

让第二组捕获任何不是逗号也不是换行符的内容:

(.*?): ([^,nr]*)(,?)(.*?)n

请注意,正则表达式需要n结尾的行。这可能过于严格,因为文本的最后一行可能不会以n结尾。还有一些文本使用rrn作为换行符。您可能需要使用$锚点,它也不会实际捕获换行符,但只是需要它。请与m(多行(修饰符一起使用。

最新更新