正则表达式:匹配所有不包含连字符的单词
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;
}
由于前瞻性简化了所有这些,并阻止您摆弄对象内部结构,我真的建议只使用前瞻性。
这是我目前的情况:
\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;
}
由于前瞻性简化了所有这些,并阻止您摆弄对象内部结构,我真的建议只使用前瞻性。