正则表达式:匹配所有不包含连字符的单词

时间:2018-06-12 18:32:52

标签: javascript cross-browser expression regex-lookarounds

这是我到目前为止所做的:

\b(?<!-)\w+(?!-)\b

匹配的内联词包含连字符。

问题:

有没有一种聪明的方法来完成上述操作,但没有使用负面的背后隐藏? (聪明可选)

1 个答案:

答案 0 :(得分:0)

通常,您希望匹配[^-]\b(\w+)\b[^-] - 与连字符不相邻的字词。这样可以很好地工作,但由于它与单词边界匹配,因此它会消耗它们,并跳过其他所有单词,因为后面的单词与前导边界不匹配。 (它也与行结尾或开头不匹配,由非捕获组解决,具有替代方案:(?:[^-]|^)\b(\w+)\b(?:[^-]|$)。)

您需要有关单词边界的信息而不消耗该字符。您可以通过前瞻或后视来获得非消费:(?:[^-]|^)\b(\w+)\b(?=[^-]|$)匹配您的单词。这不符合问题陈述。

对我而言,就像你必须编写代码来获得非消费而没有预见/后方。 RegExp对象存储最后消耗的字符的索引,因此我们可以通过稍微摆弄它来“消耗”一个字符。

function getAllWords(str) {
    let pat = /(?:[^-]|^)\b(\w+)\b(?:[^-]|$)/g;
    let res;
    let words = [];
    while (res = pat.exec(str)) {
        words.push(res[1]);
        pat.lastIndex--; //unconsume the word boundary so it can be matched again
    }
    return words;
}

由于前瞻简化了所有这一切,并阻止你摆弄对象内部,我真的建议只使用前瞻。