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

Regex: Match all words that do not contain hyphen

这是我目前的情况:

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

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

问题:

有没有一种聪明的方法可以做到上述但不使用负向回顾? (聪明是可选的)

通常您要匹配 [^-]\b(\w+)\b[^-] - 不与连字符相邻的词。这会很好用,但由于它匹配单词边界,它会消耗它们,并跳过所有其他单词,因为后面的单词无法匹配前导边界。 (它也不匹配行尾或行首,由非捕获组和备选方案解决:(?:[^-]|^)\b(\w+)\b(?:[^-]|$)。)

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

在我看来,您必须编写代码才能在没有 look-ahead/-behind 的情况下获得非消耗。 RegExp 对象存储最后使用的字符的索引,因此我们可以 "unconsume" 稍微摆弄一个字符。

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;
}

由于前瞻性简化了所有这些,并阻止您摆弄对象内部结构,我真的建议只使用前瞻性。