【问题标题】:Regular Expression to find words (using word boundary) where words include a dash character正则表达式查找单词(使用单词边界),其中单词包含破折号
【发布时间】:2010-07-22 21:30:09
【问题描述】:

给定以下正则表达式:

\b(MyString|MyString-Dash)\b

还有文字:

字符串 我的字符串 MyString-Dash

对文本运行匹配永远不会找到第二件事(MyString-Dash)的匹配项,因为“-”(破折号)字符不是单词边界字符。以下 javascript 始终将“MyString,MyString”输出到“matches”div(我想将 MyString 和 MyString-Dash 查找为不同的匹配项)。如何定义同时匹配 MyString 和 MyString-Dash 的模式?

<html>
<body>
    <h1>Content</h1>
    <div id="content">
        AString
        MyString
        MyString-Dash
    </div>
    <br>
    <h1>Matches (expecting MyString,MyString-Dash)</h1>
    <div id="matches"></div>
</body>
<script>
    var content = document.getElementById('content');
    var matchesDiv = document.getElementById('matches');
    var pattern = '\\b(MyString|MyString-Dash)\\b';
    var matches = content.innerHTML.match(pattern);
    matchesDiv.innerHTML = matches;
</script>
</html>

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    交换匹配的顺序,使最长的排在第一位:

    content.innerHTML.match(/\b(MyString-Dash|MyString)\b/)
    

    我相信正则表达式从左到右匹配。刚刚在 Firebug 中测试过,它可以工作。

    我还会将该模式 var 更改为正则表达式文字,从 '\\b(MyString-Dash|MyString)\\b' 更改为 /\b(MyString-Dash|MyString)\b/g

    你想要 /g 在那里,因为这将使正则表达式返回所有匹配项,而不仅仅是第一个。

    【讨论】:

      【解决方案2】:

      请参阅this answer,了解如何处理带有破折号的单词以及当你有这些单词时与边界相关的问题。

      【讨论】:

        【解决方案3】:

        您的假设存在一些问题。

        对文本运行匹配永远不会找到第二件事 (MyString-Dash) 的匹配项,因为“-”(破折号)字符不是单词边界字符。

        没有单词边界字符这样的东西。单词边界是匹配\w 和不匹配\w 的字符之间的空格。 - 与 '\w' 不匹配,因此它的两侧是“单词边界”,但这不会破坏您的匹配:- 是正则表达式中的文字破折号,\b 是远在它之外。

        其次,regexen 将始终尝试匹配字符串中与您的 regex 匹配的第一件事。只要那里的第一个字符串匹配,它将继续返回那里的第一件事。当您要求匹配时,您要求第一个匹配。这就是设计。如果您不希望它与 MyString 匹配,请不要要求它。

        第三,大多数正则表达式引擎优先考虑“完成匹配”而不是匹配长度。因此,如果匹配,'MyString' 将始终是它返回的第一件事。您必须等到 Perl 6 语法才能获得优先考虑长度的正则表达式引擎。 :)

        真正做到这一点的唯一方法是进行两次检查,首先检查较长的检查,然后检查较短的检查。它总是会匹配它发现的第一个有效的东西。如果您有其他优先级,则由您将其编码为单独的检查。

        【讨论】:

        • 酷 - 了解的好信息。我在这里(regular-expressions.info/wordboundaries.html)读到 \b 和 \w 基本上相当于 [a-zA-Z0-9_]
        • 这根本不是页面上所说的。 :) "元字符 \b 是一个类似于插入符号和美元符号的锚点。它匹配一个称为“单词边界”的位置
        • 并且:“简单地说:\b 允许您使用 \bword\b 形式的正则表达式执行“仅整个单词”搜索。“单词字符”是可以用于组成单词。所有不是“单词字符”的字符都是“非单词字符”。”
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-07
        • 1970-01-01
        • 2014-06-07
        • 2012-09-24
        相关资源
        最近更新 更多