我有以下正则表达式:
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 的前 3 位数字?
最佳答案
下面的正则表达式可以正常工作,正如您在 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]+
将捕获除数字以外的所有内容。
关于ruby - 为什么\d+ 不匹配所有数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49287255/