【问题标题】:Regex match for beginning of multiple words in string正则表达式匹配字符串中多个单词的开头
【发布时间】:2016-03-26 22:18:56
【问题描述】:

在 Javascript 中,我希望能够匹配以某个短语开头的字符串。但是,我希望它能够匹配短语中任何单词的开头,而不仅仅是短语的开头。

例如:

短语:“这是最好的”

需要匹配:“th”

结果:匹配 Th 和 th

编辑:\b 效果很好,但它提出了另一个问题:

它还会匹配外来字符之后的字符。例如,如果我的字符串是“Männ”,并且我搜索“n”,它将匹配 Mä 之后的 n...有什么想法吗?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:
    "This is the best moth".match(/\bth/gi);
    

    或者为你的字符串添加一个变量

    var string = "This is the best moth";
    alert(string.match(/\bth/gi));
    

    正则表达式中的\b 是单词边界,因此\bth 只会匹配单词开头的th

    gi 用于全局匹配(查找所有匹配项)且不区分大小写

    (我把moth扔进去,以提醒检查它是否不匹配)

    jsFiddle example


    编辑:

    所以,上面只返回你匹配的部分(th)。如果要返回整个单词,则必须匹配整个单词。

    这就是事情很快变得棘手的地方。首先没有 HTML 实体字母:

    string.match(/\bth[^\b]*?\b/gi);
    

    Example

    要匹配整个单词,请从单词边界\b 抓取th,然后是非单词边界[^\b],直到到达另一个单词边界\b* 表示您要查找之前的 0 个或多个(非单词边界)? 标记表示这是一个惰性匹配。换句话说,它不会扩展到尽可能大,而是一有机会就停下来。

    如果您有像 ä (ä) 这样的 HTML 实体字符,事情会变得非常复杂,您必须使用空格或空格以及一组可能位于单词边界的已定义字符。

    string.match(/\sth[^\s]*|^th[^\s]*/gi);
    

    Example with HTML entities.

    由于我们没有使用单词边界,我们必须单独处理字符串的开头 (|^)。

    上面将捕获单词开头的空白。使用\b 不会捕获空白,因为\b 没有宽度。

    【讨论】:

    • @Michael - YW!这是正则表达式的一个很好的参考 - regular-expressions.info/reference.html
    • 这很好用,除了它还会匹配外来字符之后的字符。例如,如果我的字符串是“Männ”,并且我搜索“n”,它将匹配 Mä 之后的 n...有什么想法吗?
    • @abadaba - 在答案中添加了使用\s 的可能性。
    • 但这只会匹配以空格开头的单词
    • 另外,如果单词匹配空格后面的任何内容,你能不能让匹配数组返回没有空格的单词?
    【解决方案2】:

    在正则表达式中使用g 标志。我认为它代表“全局”,它搜索 所有 匹配项,而不仅仅是第一个匹配项。

    您还应该使用i 标志进行不区分大小写的匹配。

    您将标志添加到正则表达式的末尾 (/<regex>/<flags>) 或作为第二个参数添加到 new RegExp(pattern, flags)

    例如:

    var matches = "This is the best".match(/\bth/gi);
    

    或者,使用RegExp 对象:

    var re = new RegExp("\\bth", "gi");
    var matches = re.exec("This is the best");
    

    编辑: 在正则表达式中使用\b 来匹配一个单词的boundary。请注意,它实际上并不匹配任何特定字符,而是匹配单词或字符串的开头或结尾。

    【讨论】:

    • 但这会在我不想要的字符串中的单词之间搜索
    • 这也将匹配字符串中的moth
    • 这将匹配所有出现的“th”,无论它们是否位于单词的开头。
    • abadaba:只需在正则表达式的开头使用 \b 即可。 \b 表示“边界”,它不匹配任何特定字符,但它匹配单词的开头/结尾和字符串。
    • 这很好用,除了它还会匹配外来字符之后的字符。例如,如果我的字符串是“Männ”,并且我搜索“n”,它将匹配 Mä 之后的 n...有什么想法吗?
    【解决方案3】:

    使用这个:

    string.match(/^th|\sth/gi);
    

    例子:

    'is this is a string'.match(/^th|\sth/gi);
    
    
    'the string: This is a string'.match(/^th|\sth/gi);
    

    结果:

    ["th", "th"]

    [“第”]

    【讨论】:

    • 既然 op 提到,any word 假设单词边界有空格可能不安全。您的正则表达式与Here-is-the-sentence! 中的任何内容都不匹配。这就是为什么\b 作为单词边界更好。
    【解决方案4】:
    var matches = "This is the best".match(/\bth/ig);
    

    返回:

    ["Th", "th"]
    

    正则表达式的意思是:如果“th”是字符串中的第一个单词或者“th”前面有一个空格字符,则忽略大小写和全局匹配“th”(意思是,不要只在一个匹配处停止) .

    【讨论】:

    • 既然 op 提到,any word 假设单词边界有空格可能不安全。您的正则表达式与Here-is-the-sentence! 中的任何内容都不匹配。这就是为什么\b 作为单词边界更好。
    • @Peter 谢谢!不知道\b
    • @Vivn - 由于行首字符^,您的示例仍然只匹配“Th”。对字符串行首的全局搜索仍然只返回 1 个 find ;) - jsfiddle.net/NHcLx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    相关资源
    最近更新 更多