0

我的数据包含这样的行:

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

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

4

5 回答 5

2

您需要使* 懒惰而不是贪婪

,"(.*?)",

或匹配所有字符,但"

,"[^"]*",
于 2012-07-13T14:46:31.640 回答
1

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

于 2012-07-13T14:47:42.483 回答
0
/"([^"]+)"/

会做的工作!“-s”之间的所有内容

于 2012-07-13T14:46:36.493 回答
0

你的正则表达式是贪婪的,.*会得到一切,直到最后

因此,要使其不贪心,请添加? 在括号部分的末尾:

,"(.*?)",

一旦到达下一个“应该立即停止它

于 2012-07-13T14:47:28.697 回答
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"

您可能还需要考虑将输入拆分为字段,然后测试每个字段,直到找到匹配项。很大程度上取决于您可以使用的设施。

于 2012-07-13T15:01:53.053 回答