我有以下正则表达式:
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的前三位数?
答案 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]+
将捕获除数字之外的所有内容。