如何让我的正则表达式只返回该行的第一个匹配?

时间:2012-07-13 14:43:44

标签: regex

我的数据包含以下行:

55 511 00,"805, 809, 810, 839, 840",J223,201,338,116,16,200,115,6,P,S,"8,5","25,74",47,242,"55,7"

我已经尝试,"(.*)",作为正则表达式,但它捕获了过多的行。该表达式当前返回:

,"805, 809, 810, 839, 840",J223,201,338,116,16,200,115,6,P,S,"8,5","25,74",

但我真正想要的只是第一个引用的字符串。有效结果将是:

  • ,"805, 809, 810, 839, 840",
  • 805, 809, 810, 839, 840

我怎样才能捕获第一场比赛?

5 个答案:

答案 0 :(得分:2)

您需要制作* lazy instead of greedy

,"(.*?)",

或匹配除"之外的所有字符:

,"[^"]*",

答案 1 :(得分:1)

试试"([^"]+)。第1组将匹配805, 809, 810, 839, 840

答案 2 :(得分:0)

/"([^"]+)"/

将完成这项工作! “-s

之间的一切

答案 3 :(得分:0)

你的正则表达式是贪婪的,。* 会把所有内容都拿到最后

为了使其不贪心,在括号内的部分末尾添加

,"(.*?)",

一旦到达下一个

,它应立即停止

答案 4 :(得分:0)

使用非贪婪的比赛

有很多方法可以解决这个问题,但最简单和最通用的方法是使用非贪婪的匹配,如果你的正则表达式引擎支持它。如果没有,则必须构建一个对数据结构有更多了解的表达式。

一些例子

以下是使用Perl兼容的正则表达式来分割输出的示例:

$ pcregrep -o '"(.*?)"' /tmp/foo | head -n1
"805, 809, 810, 839, 840"

这是另一个使用纯Perl的例子:

$ perl -ne 'print "$1\n" if /(".*?")/' /tmp/foo
"805, 809, 810, 839, 840"

这是使用POSIX扩展正则表达式的第三个示例,但不支持非贪婪匹配。

$ egrep -o '("[^"]+")' /tmp/foo | head -n1
"805, 809, 810, 839, 840"

您可能还需要考虑将输入拆分为字段,然后测试每个字段,直到找到匹配项。很多只取决于您拥有的设施。