为什么\ d +不匹配所有数字?

Don*_*ato 5 ruby regex

我有以下正则表达式:

REGEX = /^.+(\d+.+(?=AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)[A-Z]{2}[, ]+\d{5}(?:-\d{4})?).+/
Run Code Online (Sandbox Code Playgroud)

我有以下字符串:

str = "fdsfd 8126 E Bowen AVE Bensalem, PA 19020-1642 dfdf"
Run Code Online (Sandbox Code Playgroud)

请注意,我的捕获组以与模式匹配的一个或多个数字开头.然而,这就是我得到的:

str =~ REGEX
$1
 => "6 E Bowen AVE Bensalem, PA 19020-1642" 
Run Code Online (Sandbox Code Playgroud)

要么

match = str.match(REGEX)
match[1]
=> "6 E Bowen AVE Bensalem, PA 19020-1642"
Run Code Online (Sandbox Code Playgroud)

为什么它缺少812的前三位数?

Ada*_*dam 7

正如您在Regex101中所看到的,以下正则表达式正常工作

REGEX = /^.+?(\d+.+(?=AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY)[A-Z]{2}[, ]+\d{5}(?:-\d{4})?).+/
Run Code Online (Sandbox Code Playgroud)

请注意在正则表达式的开头附近添加问号

/^.+?(\d+...
    ^ 
Run Code Online (Sandbox Code Playgroud)

默认情况下,您的第一个.+是贪婪的,消耗它可以的所有数字,并仍然允许正则表达式传递.通过在加号?之后添加,你可以使它变得懒惰而不是贪婪.

另一种方法是不捕获数字,如下所示:

/^[^\d]+(\d+...
Run Code Online (Sandbox Code Playgroud)

[^\d]+ 将捕获除数字之外的所有内容.

  • 或者,使用`\ D`代替`[^\d]`...类似地,`\ S`,`\ H`,`\ W`等,请参阅https://ruby-doc.org/core-2.5 0.0/Regexp.html#类的正则表达式,标签字+类 (2认同)