繁体   English   中英

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

[英]Regex: Match all words that do not contain hyphen

这是我到目前为止所拥有的:

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

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

题:

有一种聪明的方法可以完成上述操作,但又不会在后面使用负面的看法吗? (聪明是可选的)

通常,您要匹配[^-]\\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;
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM