为什么这个匹配过去'不是逗号'?

时间:2012-07-17 21:29:41

标签: regex

我有一个字符串,如下所示:

"1132","Fredricks, Ben","Boulder,         CO","x755593"

我有以下正则表达式,我认为不应该匹配:

^"\d+",".*?","[^,]+"

但它匹配整个字符串。不应该[^,]+这意味着,我认为"匹配所有不是逗号的东西直到引号...导致匹配失败?它遇到了一个我认为会使它不匹配的逗号。

我想我的问题是......为什么这匹配?我试图在第三组引号中找不到逗号的内容。

2 个答案:

答案 0 :(得分:3)

?中的.*?只会使匹配非贪婪。没有它,模式将尽可能多地捕获,同时仍然匹配其余模式。可能会添加它以避免在"上匹配该模式,但它不会阻止它。如果您查看了捕获的字符串(如果您匹配"(\d+)"等,以便$1包含匹配项),您会发现.*?匹配的内容比您预期的多(多个字段)。< / p>

答案 1 :(得分:1)

使用间隔表达式

如果您只是想捕获记录的前三个字段,则以下内容将起作用:

^"\d+"(,"[^"]+?"){2}

例如:

$ echo '"1132","Fredricks, Ben","Boulder,         CO","x755593"' | 
    pcregrep --only-matching '^"\d+"(,"[^"]+?"){2}'
"1132","Fredricks, Ben","Boulder,         CO"