我有以下正则表达式(我从另一个中提取它以重现错误):
test_regex = /(^[A-Z]{2}[, ]+\d{5}(?:-\d{4})?).+/
它匹配州名缩写,邮政编码和一些更随机的字符:
"PA 19020 iuhiu" =~ test_regex
=> 0
但是我有一个用例可能附加状态和邮政编码:
"PA19020 iuhiu" =~ test_regex
=> nil
所以我需要考虑到这一点。我的解决方案是使用?
可选字符使字符类[]
可选。因此,我需要使用()
分组运算符对字符类和+
一个或多个字符匹配器进行分组。与此同时,我不想把它作为一个群体来捕捉。所以我需要使用:?
来确保它是一个非捕获组。我的解决方案:
(?:[, ]+)?
但是当我尝试时,发生了以下情况:
test_regex2 = /(^[A-Z]{2}(?:[, ]+)?\d{5}(?:-\d{4})?).+/
/.rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/irb/workspace.rb:86: warning: nested repeat operator + and ? was replaced with '*': /(^[A-Z]{2}(?:[, ]+)?\d{5}(?:-\d{4})?).+/
=> /(^[A-Z]{2}(?:[, ]+)?\d{5}(?:-\d{4})?).+/
为什么它会给我这个错误?我只是希望所说的字符是可选的而不是捕获的。