我有一个perl正则表达式,我非常确定它应该工作(perl),但是太贪婪了:
regex:(?:.*serial[^\d]+?(\d+).*)
测试字符串:APPLICATIONSERIALNO123456Plnsn123456te20140728tdrnserialnun12hou
理想组1匹配:123456
实际1组比赛:12
我已经试过了每一次向前看、后看和懒惰的排列,我不能让这该死的东西工作。
我错过了什么。
谢谢!
发布于 2014-07-29 13:29:02
问题不在于贪婪,而在于案件的敏感性。
目前,正则表达式与12
在serialnun12
末尾匹配,可能是因为它区分大小写。我们有两个选项:使用大写,或使模式不区分大小写.
选项1:使用大写
如果您只想要123456
,您可以使用:
SERIALNO\K\d+
\K
告诉引擎放弃匹配的内容,而不是它返回的最后一次匹配。
如果要匹配整个字符串并将123456
捕获到第1组,请使用:
.*?SERIAL\D+(\d+).*
(?i)
选项2:在使用内联或 i
标志时转向区分大小写
要只匹配123456
,可以使用:
(?i)serial\D+\K\d+
注意,如果使用g
标志,这将匹配这两个数字。
如果要匹配整个字符串并将123456
捕获到第1组,请使用:
(?i).*?serial\D+(\d+).*
几个小贴士
(?i)
内联修饰符或模式末尾的i
标志来切换大小写不敏感:/serial\D+\K\d+/i
。[^\d]
,而是使用\D
\D+\d+
的东西中不需要使用惰性量词,因为这两个标记是相互排斥的:不存在\D
会在\d
上运行的危险。发布于 2014-07-30 07:27:20
问题不是贪婪,而是对案件的敏感性。
目前,regex与12
在serialnun12
末尾匹配,因为这些是serial
后面的唯一数字。你想要的人都跟着SERIAL
。S
和s
是不同的字符。
有两种解决办法。
https://stackoverflow.com/questions/25025286
复制