【问题标题】:unexpected regex match意外的正则表达式匹配
【发布时间】: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

【问题讨论】:

标签: ruby regex


【解决方案1】:

[...] 在正则表达式中指定一个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]]/
  • @Jörg 它没有在 irb 或 Rubular 上给我警告,但公平点。
【解决方案2】:

试试看

assert_no_match(/^(tel|fax|web)/i, "www.jehall.co.uk")

应该可以。否则,您将匹配字符,即 web 中的 w 将匹配。

【讨论】:

    【解决方案3】:

    你应该使用

    /^(?:tel|fax|web)/i
    

    【讨论】:

    • 你为什么会有猫王笑脸?:
    • @Aillyn:这样它就不会创建捕获。
    • @Aillyn:你是不是建议 ?: 不应该在那里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2020-09-12
    相关资源
    最近更新 更多