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/