Regex 正则表达式贪婪性
我有一个perl正则表达式,我相当确定它应该工作(perl),但它太贪婪了: 正则表达式:Regex 正则表达式贪婪性,regex,perl,Regex,Perl,我有一个perl正则表达式,我相当确定它应该工作(perl),但它太贪婪了: 正则表达式: (?:.*串行[^\d]+?(\d+.*) 测试字符串: APPLICATIONSERIALNO123456Plnsn123456te20140728tdrnserialnun12hou 所需的第1组匹配: 123456 第一组的实际比赛: 12 我已经尝试了所有的前后看和懒惰的排列方式,但我无法让这该死的东西发挥作用 我错过了什么 谢谢 问题不在于贪婪,而在于区分大小写 当前,您的正则表达式与seria
(?:.*串行[^\d]+?(\d+.*)
测试字符串:
APPLICATIONSERIALNO123456Plnsn123456te20140728tdrnserialnun12hou
所需的第1组匹配:
123456
第一组的实际比赛:
12
我已经尝试了所有的前后看和懒惰的排列方式,但我无法让这该死的东西发挥作用
我错过了什么
谢谢 问题不在于贪婪,而在于区分大小写
当前,您的正则表达式与serialnun12
末尾的12
匹配,可能是因为它区分大小写。我们有两种选择:使用大写,或者使模式不区分大小写
选项1:使用大写
如果您只想要123456
,您可以使用:
SERIALNO\K\d+
(?i)serial\D+\K\d+
\K
告诉引擎放弃与其返回的最终匹配项相距甚远的匹配项
如果要匹配整个字符串并将123456
捕获到组1,请使用:
.*?SERIAL\D+(\d+).*
(?i).*?serial\D+(\d+).*
选项2:使用(?i)
内联或i
标志打开区分大小写
要仅匹配123456
,您可以使用:
SERIALNO\K\d+
(?i)serial\D+\K\d+
请注意,如果使用g
标志,这将匹配两个数字
如果要匹配整个字符串并将123456
捕获到组1,请使用:
.*?SERIAL\D+(\d+).*
(?i).*?serial\D+(\d+).*
一些提示
- 您可以使用
内联修饰符或模式末尾的(?i)
标志来启用大小写不敏感:i
/serial\D+\K\D+/i
- 使用
\d
- 在类似
的东西中不需要惰性量词,因为这两个标记是互斥的:不存在\D+\D+
将在\D
上运行的危险\D
serialnun12
末尾的12
匹配,可能是因为它区分大小写。我们有两种选择:使用大写,或者使模式不区分大小写
选项1:使用大写
如果您只想要123456
,您可以使用:
SERIALNO\K\d+
(?i)serial\D+\K\d+
\K
告诉引擎放弃与其返回的最终匹配项相距甚远的匹配项
如果要匹配整个字符串并将123456
捕获到组1,请使用:
.*?SERIAL\D+(\d+).*
(?i).*?serial\D+(\d+).*
选项2:使用(?i)
内联或i
标志打开区分大小写
要仅匹配123456
,您可以使用:
SERIALNO\K\d+
(?i)serial\D+\K\d+
请注意,如果使用g
标志,这将匹配两个数字
如果要匹配整个字符串并将123456
捕获到组1,请使用:
.*?SERIAL\D+(\d+).*
(?i).*?serial\D+(\d+).*
一些提示
- 您可以使用
内联修饰符或模式末尾的(?i)
标志来启用大小写不敏感:i
/serial\D+\K\D+/i
- 使用
\d
- 在类似
的东西中不需要惰性量词,因为这两个标记是互斥的:不存在\D+\D+
将在\D
上运行的危险\D
问题不在于贪婪;这是区分大小写的 当前,您的正则表达式与
serialnun12
末尾的12
匹配,因为它们是serial
后面唯一的数字。您想要的是串行的S
和S
是不同的字符
有两种解决方案
my ($serial) = $string =~ /SERIAL\D*(\d+)/;
my ($serial) = $string =~ /serial\D*(\d+)/i;
也许没有必要,但我想我还是提一下以防万一问题不在于贪婪;这是区分大小写的 当前,您的正则表达式与
serialnun12
末尾的12
匹配,因为它们是serial
后面唯一的数字。您想要的是串行的S
和S
是不同的字符
有两种解决方案
my ($serial) = $string =~ /SERIAL\D*(\d+)/;
my ($serial) = $string =~ /serial\D*(\d+)/i;
也许没有必要,但我想我还是提一下以防万一而且仍然显示不同的选项和详细说明:]除了替换之外,三次提到
\K
有什么关系?@Jonny5不理解你的评论,你能解释一下吗?@Jonny5,他是否正常提供工作答案真的不重要。//至于我为什么没有提供答案,就像你说的:他的大部分解决方案都很好;只有一部分不起作用。我不想只是去复制他的解决方案的工作部分。这就是你要我做的吗至于我们的“垃圾评论”,他似乎知道他在说什么,他一直声称他知道他在说什么,所以我想我可能错过了什么。但事实证明,他知道正则表达式,但不知道它们在Perl中是如何使用的。谢谢!我实际上不区分大小写,但能够用这个答案来回答我的问题:)非常感谢!而且仍然显示不同的选项和详细说明:]除了替换之外,三次提到\K
有什么关系?@Jonny5不理解你的评论,你能解释一下吗?@Jonny5,他是否正常提供工作答案真的不重要。//至于我为什么没有提供答案,就像你说的:他的大部分解决方案都很好;只有一部分不起作用。我不想只是去复制他的解决方案的工作部分。这就是你要我做的吗至于我们的“垃圾评论”,他似乎知道他在说什么,他一直声称他知道他在说什么