这是我到目前为止所做的:
\b(?<!-)\w+(?!-)\b
匹配不的内联词包含连字符。
问题:
有没有一种聪明的方法来完成上述操作,但没有使用负面的背后隐藏? (聪明可选)
答案 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;
}
由于前瞻简化了所有这一切,并阻止你摆弄对象内部,我真的建议只使用前瞻。