我如何在Ruby中指定我想匹配一个字符,前提是该字符后面的序列与模式不匹配?

时间:2017-12-01 17:12:43

标签: ruby regex pattern-matching

我使用Ruby on Rails 5.1。在Ruby中,如果第一个字符与某个字符匹配但是后面的序列与模式不匹配,我怎么说taht我想匹配一个字符串?也就是说,我希望匹配一个数字,前提是序列taht跟随的不是数组中的字符,后面跟着另外两个数字。这是我的角色阵列......

2.4.0:010> TOKENS  => [":","。","'"]

所以这个字符串不匹配

3:00

自" 00"匹配我的数组中的字符模式,后跟两个数字。但是这个字符串

3400

会匹配。该字符串也匹配

3:0

这将匹配

3

因为上面没有任何内容。如何在Ruby中编写适当的正则表达式?

2 个答案:

答案 0 :(得分:1)

string =~ /\A\d+(?!:\d{2})/

这个正则表达式意味着:

  • \A将匹配固定在字符串的 start 上。
  • \d+表示"一个或多个数字"。
  • (?!...)否定前瞻。它检查括号中包含的模式是否匹配。,从当前位置向前看。
  • :\d{2}表示:后跟两位数字。

答案 1 :(得分:0)

应该考虑分别测试第一个字符和剩余字符。

def match_it?(str, first_char_regex, no_match_regex)
  str[0].match?(first_char_regex) && !str[1..-1].match?(no_match_regex)
end

match_it?("0:00", /0/, /\A[:. ]cat\z/)           #=> true
match_it?("0:00", /\d/, /\A[:. ]\d+\z/)          #=> false
match_it?("0:00", /[[:alpha:]]/, /\A[:. ]\d+\z/) #=> false

我相信这读得很好,与使用单个正则表达式的方法相比,它简化了测试。