Ruby 过分急切的正则表达式

Ruby 过分急切的正则表达式,ruby,regex,Ruby,Regex,我试图避免在我的输入框中出现电子邮件,所以我使用了多个正则表达式,我得到了一个比我想要的匹配更多的正则表达式,这是正则表达式: (at( )*\w+(\b\.ie\b|\b\ .ie\b)) 它应该与域中的电子邮件等尝试相匹配。但我也得到了这部分匹配: 另外,在平局时,它们是 如何修改此正则表达式以不匹配此情况 我试过这个: (at( )[a-z^\s]\w+(\b\.ie\b|\b\ .ie\b)) 还有几件事,我仍然得到了相同的匹配,我如何仍然保持我想要的匹配,但要避免这种情况要避免意外

我试图避免在我的输入框中出现电子邮件,所以我使用了多个正则表达式,我得到了一个比我想要的匹配更多的正则表达式,这是正则表达式:

(at( )*\w+(\b\.ie\b|\b\ .ie\b))
它应该与域中的电子邮件等尝试相匹配。但我也得到了这部分匹配:

另外,在平局时,它们是

如何修改此正则表达式以不匹配此情况

我试过这个:

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

还有几件事,我仍然得到了相同的匹配,我如何仍然保持我想要的匹配,但要避免这种情况

要避免意外的匹配,请尝试在正则表达式中使用文字句点
\。
。根据几个输入进行测试,似乎可以得到您想要的:

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

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

要匹配类似“at foo.ie”或“at foo.ie”的东西,像这样简单的东西会起作用:
/\bat+\w+?\.ie\b/

只是为了清楚,您是否正在尝试匹配类似的东西“at foo.ie”或“at foo.ie”"? 根据你的问题,我认为像这样简单的事情会奏效:
/\bat+\w+?\。ie\b/
你能回答这个问题吗这是在foo不匹配的
。ie
irb不同意:
/\bat+\w+?\。ie\b/.match'在foo.ie'
=>
好吧,如果这个编辑器没有那么混乱,你会认为它是“at\tfoo\t.ie”就像我贴的那样,与你的正则表达式不匹配。啊哈,我明白了。:)从甘道夫在原始问题中的尝试来看,他明确想要空格字符……但是如果你想要任何空格,很容易匹配:
/\bat\s+\w+\s?\.ie\b/