Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式贪婪性_Regex_Perl - Fatal编程技术网

Regex 正则表达式贪婪性

Regex 正则表达式贪婪性,regex,perl,Regex,Perl,我有一个perl正则表达式,我相当确定它应该工作(perl),但它太贪婪了: 正则表达式: (?:.*串行[^\d]+?(\d+.*) 测试字符串: APPLICATIONSERIALNO123456Plnsn123456te20140728tdrnserialnun12hou 所需的第1组匹配: 123456 第一组的实际比赛: 12 我已经尝试了所有的前后看和懒惰的排列方式,但我无法让这该死的东西发挥作用 我错过了什么 谢谢 问题不在于贪婪,而在于区分大小写 当前,您的正则表达式与seria

我有一个perl正则表达式,我相当确定它应该工作(perl),但它太贪婪了:

正则表达式:
(?:.*串行[^\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,他是否正常提供工作答案真的不重要。//至于我为什么没有提供答案,就像你说的:他的大部分解决方案都很好;只有一部分不起作用。我不想只是去复制他的解决方案的工作部分。这就是你要我做的吗至于我们的“垃圾评论”,他似乎知道他在说什么,他一直声称他知道他在说什么