正则表达式用于查找单词(使用单词边界),其中单词包含短划线字符

时间:2010-07-22 21:30:09

标签: javascript regex

给出以下正则表达式:

\ B(MyString的| MyString的-DASH)\ B'/ P>

文字:

ASTRING MyString的 MyString的-短跑

对文本运行匹配永远不会找到第二个匹配项(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>

3 个答案:

答案 0 :(得分:1)

交换匹配的顺序,以便尽可能最长:

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

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

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

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

答案 1 :(得分:1)

请参阅this answer,了解如何处理包含短划线的单词以及有这些单词时与边界相关的问题。

答案 2 :(得分:0)

您的假设存在一些问题。

  

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

没有单词边界字符这样的东西。字边界是与\w匹配且与\w不匹配的字符之间的空格。 -与\'w'不匹配,因此它的任何一侧都是“单词边界”,但这不会破坏你的匹配: - 是正则表达式中的文字短划线和{{1}远远超出它。

其次,regexen将始终尝试匹配匹配正则表达式的字符串中的第一个东西。只要那里的第一个字符串匹配,它将继续返回那里的第一个字符串。当你要求比赛时,你要求第一场比赛。这就是设计。如果您不希望它与MyString匹配,请不要求它。

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

您真正做到这一点的唯一方法是使用两个检查,一个用于较长的检查,第一个检查,然后用于较短的一个检查。它始终匹配它找到的第一件有效的东西。如果您具有除此之外的优先级,则由您将其作为单独的检查进行编码。

相关问题