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

时间:2018-03-14 20:39:57

标签: 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})?).+/

我有以下字符串:

str = "fdsfd 8126 E Bowen AVE Bensalem, PA 19020-1642 dfdf"

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

str =~ REGEX
$1
 => "6 E Bowen AVE Bensalem, PA 19020-1642" 

或者

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

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

1 个答案:

答案 0 :(得分: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})?).+/

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

/^.+?(\d+...
    ^ 

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

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

/^[^\d]+(\d+...

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