【发布时间】:2010-08-23 15:17:27
【问题描述】:
谁能解释为什么下面的测试没有通过。正则表达式正在匹配我不想要的匹配项。
我想在以 Tel、Fax 或 Web 开头的文本上查找匹配项,但由于某种原因,测试中的 url 正在匹配:
def test_url_should_match
assert_no_match(/^[tel|fax|web]/i, "www.jehall.co.uk")
end
【问题讨论】:
谁能解释为什么下面的测试没有通过。正则表达式正在匹配我不想要的匹配项。
我想在以 Tel、Fax 或 Web 开头的文本上查找匹配项,但由于某种原因,测试中的 url 正在匹配:
def test_url_should_match
assert_no_match(/^[tel|fax|web]/i, "www.jehall.co.uk")
end
【问题讨论】:
[...] 在正则表达式中指定一个character class,它告诉正则表达式引擎匹配括号中包含的这些字符之一。因此,[tel|fax|web] 的意思是“匹配 t 或 e 或 l 或 | 或 f 或 a 或 x 或 w 或 e 或 b”(| 在类中出现多次的事实无关紧要)。由于字符串以 w 开头——它在字符类中——模式匹配。
正如其他答案所说,您想使用括号 (...) 来对您的交替进行分组。
【讨论】:
| 出现多次的事实 是相关的,因为它会生成一个警告,如果 OP 真的打扰 read i>,已经告诉他出了什么问题:warning: character class has duplicated range: /[^[tel|fax|web]]/
试试看
assert_no_match(/^(tel|fax|web)/i, "www.jehall.co.uk")
应该可以。否则,您将匹配字符,即 web 中的 w 将匹配。
【讨论】:
你应该使用
/^(?:tel|fax|web)/i
【讨论】:
?:?
?: 不应该在那里?