ruby regex .scan

时间:2009-08-05 21:12:28

标签: ruby regex

我正在使用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

我知道我可以使用两到三次不同的扫描来实现我的结果,但我想知道是否有办法让所有这三个都有一个正则表达式。

4 个答案:

答案 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...

参考这些网址:

Ruby gsub / regex modifiers?

http://ruby-doc.org/docs/ruby-doc-bundle/Manual/man-1.4/syntax.html#regexp

如果您想了解有关正则表达式的更多信息。