我正在使用Ruby的scan()方法查找特定格式的文本。然后我将它输出到用逗号分隔的字符串中。我试图找到的文字看起来像这样:
AB_ABCD_123456
这是我到目前为止找到的内容。它工作正常:
text.scan(/.._...._[0-9][0-9][0-9][0-9][0-9][0-9]/)
puts text.uniq.sort.join(', ')
现在我需要一个正则表达式,在最后有或没有两个字母的国家/地区名称。例如,我希望能够找到以下所有三个:
AB_ABCD_123456
AB_ABCD_123456UK
AB_ABCD_123456DE
我知道我可以使用两到三次不同的扫描来实现我的结果,但我想知道是否有办法让所有这三个都有一个正则表达式。
答案 0 :(得分:13)
/.._...._[0-9][0-9][0-9][0-9][0-9][0-9](?:[A-Z][A-Z])?/
您还可以使用{}缩短正则表达式:
/.{2}_.{4}_[0-9]{6}(?:[A-Z]{2})?/
说明:?
使前面的模式可选。 ()
将表达式组合在一起(因此ruby知道?
适用于这两个字母)。打开?:
后的(
会使组无法捕获(捕获组会更改扫描产生的值)。
答案 1 :(得分:1)
/.._...._\d{6}([A-Z]{2})?/
答案 2 :(得分:1)
为什么不使用拆分?
"AB_ABCD_123456".split(/_/).join(',')
处理您列出的案例而不做任何修改。
答案 3 :(得分:1)
试试这个:
text.scan(/\w{2}_\w{4}_\d{6}\w{0,2}/)
#matches AB_ABCD_123456UK or ab_abcd_123456uk and so on...
或
text.scan(/[A-Z]{2}_[A-Z]{4}_\d{6}[A-Z]{0,2}/)
# tighter, matches only AB_ABCD_123456UK and similars...
# and not something like ab_aBCd_123456UK or ab_abcd_123456uk and similars...
参考这些网址:
http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#regexp
如果您想了解有关正则表达式的更多信息。