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

Javascript 正则表达式:匹配所有不包含连字符的单词,javascript,cross-browser,expression,regex-lookarounds,Javascript,Cross Browser,Expression,Regex Lookarounds,以下是我到目前为止的情况: \b(?) 匹配不包含连字符的内联词 问题: 有没有一种聪明的方法可以做到这一点,但不需要使用消极的后视? (聪明是可选的)通常,您希望匹配[^-]\b(\w+)\b[^-]-一个与连字符不相邻的单词。这将非常有效,但由于它匹配单词边界,因此会消耗它们,并跳过每一个单词,因为下面的单词无法匹配前导边界。(它也不匹配行尾或行首,由非捕获组使用以下选项解决:(?:[^-]|^)\b(\w+)\b(?:[^-]|$)) 在不使用字符的情况下,您需要有关单词边界的信息。您可以

以下是我到目前为止的情况:

\b(?)

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

问题:

有没有一种聪明的方法可以做到这一点,但不需要使用消极的后视?
(聪明是可选的)

通常,您希望匹配
[^-]\b(\w+)\b[^-]
-一个与连字符不相邻的单词。这将非常有效,但由于它匹配单词边界,因此会消耗它们,并跳过每一个单词,因为下面的单词无法匹配前导边界。(它也不匹配行尾或行首,由非捕获组使用以下选项解决:
(?:[^-]|^)\b(\w+)\b(?:[^-]|$)

在不使用字符的情况下,您需要有关单词边界的信息。您可以从前向或后向获取非使用信息:
(?:[^-]|^)\b(\w+)\b(?=[^-]|$)
与您的单词匹配。这与问题陈述不符

在我看来,您必须编写代码才能在不使用look-ahead/-behind的情况下不使用字符。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;
}

由于lookahead大大简化了所有这一切,并阻止了您对对象内部的处理,我真的建议您只使用lookahead。

使用捕获组提取单词,并在前面使用替换来描述可能的内容:
(?:^[^-\w])(\w+)\b(?!-)
。如果您的模式是替换模式,请将非捕获组更改为捕获组。谢谢您的回答。我只需要一个反向查找的替代方案,因为它几乎不支持浏览器。由于解决方案不是那么简单,我想做一个简单的筛选循环就足够了:
var result=str.split(“”).filter(f=>f.indexOf('-')==-1);