![](/img/trans.png)
[英]How can I get my Regular Expression to take the first match, and ignore any following matches?
[英]How can I get my regular expression to return only the first match on the line?
我的数据包含以下行:
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
我怎样才能只捕获第一场比赛?
尝试"([^"]+)
。 第一组将匹配805, 809, 810, 839, 840
/"([^"]+)"/
会做的工作! “ -s”之间的所有内容
您的正则表达式是贪婪的, 。*将会使所有内容都保留下来,直到最后一个“
因此,要使其不贪心,请添加? 在方括号部分的末尾:
,"(.*?)",
当到达下一个“
有很多方法可以解决此问题,但是最简单,最通用的方法是在正则表达式引擎支持的情况下使用非贪婪匹配。 如果不是,则必须构建一个对数据结构了解更多的表达式。
这是一个使用与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"
您可能还需要考虑将输入分成多个字段,然后测试每个字段,直到找到匹配项。 很大程度上取决于您拥有什么设施。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.