1

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

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

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

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

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

我想我的问题是......为什么这样匹配?我试图在第三组引号中找到没有逗号的东西。

4

2 回答 2

3

?in.*?只会使匹配不贪心。没有它,模式将尽可能多地捕获,同时仍然匹配其余部分。添加它可能是为了避免在 a 中出现该模式匹配,"但它并不能阻止它。如果您查看捕获的字符串(如果您匹配"(\d+)"等,则$1包含匹配项),您会发现您的.*?匹配项比您预期的要多得多(多个字段)。

于 2012-07-17T21:33:59.180 回答
1

改用区间表达式

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

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

例如:

$ echo '"1132","Fredricks, Ben","Boulder,         CO","x755593"' | 
    pcregrep --only-matching '^"\d+"(,"[^"]+?"){2}'
"1132","Fredricks, Ben","Boulder,         CO"
于 2012-07-17T21:36:54.743 回答