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

标签 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 的前 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/

相关文章:

ruby-on-rails - 如何修复 'warning: constant::Fixnum is deprecated'错误

ruby - 如何通过 ruby​​ UDPSocket 类发送原始十六进制数据?

ruby-on-rails - RVM、Rails 错误

ruby-on-rails - Rails 自动加载不加载模块

javascript - 非 PushState 浏览器中的 JQuery Mobile 查询字符串问题

python - 从 python 文件中读取特定字符串?

javascript - 为什么我在 Gitlab CI 中出现 TypeError,但在运行 jest 时在我的机器上却没有?

ruby - 使用 Ruby Mechanize 下载作为附件的文件

javascript - "Regex that match any character inside a parenthesis"的更多帮助

MySQL正则表达式更新查询