过分热切的正则表达式

时间:2014-02-15 15:30:04

标签: ruby regex

我试图在输入字段框中避免使用电子邮件,因此我使用多个正则表达式,我得到的匹配比我想要的更多,这是正则表达式:

(at( )*\w+(\b\.ie\b|\b\ .ie\b))

它应该匹配domain.ie上的电子邮件等尝试,但我也得到了这部分匹配:

也是at a tie他们

如何修改此正则表达式以使其不符合此情况?

我试过了:

(at( )[a-z^\s]\w+(\b\.ie\b|\b\ .ie\b))

以及其他几件事,我仍然得到相同的匹配,我怎么能保持我想要的匹配但是要避免这种情况

2 个答案:

答案 0 :(得分:1)

为了匹配“at foo.ie”或“at foo .ie”之类的东西,这样简单的事情就可以了:/\bat +\w+ ?\.ie\b/

答案 1 :(得分:0)

要避免意外匹配,请尝试在正则表达式中使用文字句点\.。针对少数输入进行测试看起来像是你想要的:

tests = [
  {:text => 'at domain.ie',             :expected => true},
  {:text => 'at something.ie',          :expected => true},
  {:text => 'at foo.ie',                :expected => true},
  {:text => 'also what a tie they are', :expected => false}
]

regex = /\bat\s+\w+\s?\.ie\b/

tests.each do |test|
  text         = test[:text]
  expect_match = test[:expected]
  matched = false
  if text =~ regex
    matched = true
  end

  if expect_match == matched
    puts "OK:     expected=#{expect_match} == #{matched} for regex=#{regex} vs text=#{text}"
  else
    puts "NOT OK: expected=#{expect_match} != #{matched} for regex=#{regex} vs text=#{text}"
  end
end

如果您有更多测试用例,应该很容易将它们添加到上面的代码中 - 尽管您可能希望使用类似rspec的内容进行更正式的测试。