我有一个奇怪的问题与regex,我试图检查用户输入的contentEditable div与regex,在每次keydown后,如果它匹配,例如“hello”或“status”,它应该返回修改后的文本与<span style="color: purple">hello<span>
。它的工作正常与唯一的单词,短语或粘贴,但当我声明“hello”和“hello world”作为关键字,并在contentEditable中键入它,regex只匹配“hello”,即使“hello world”是字符串数组中第一个。
下面是函数的代码:
searchByRegEx(wordsArr: string[], sentence: string): string {
let matchingWords = []; // matching words array
wordsArr.forEach((label) => {
const regEx = new RegExp(label, 'gi');
regEx.lastIndex = 0
let match = regEx.exec(sentence);
while (match) {
// console.log(match) - results of this console.log below
matchingWords.push(match[0]);
match = regEx.exec(sentence);
}
});
matchingWords = matchingWords.sort(function (a, b) {
return b.length - a.length;
});
matchingWords.forEach((word) => {
sentence = sentence.replaceAll(
word,
`<span style='color:${InputColorsHighlightValue.PURPLE}'>${word}</span>`
);
});
return sentence
}
}
下面是我如何使用它:
if (this.labels) {
textToShow = this.searchByRegEx(['hello', 'hello world'], textToShow)
}
这是它在devTools中的外观,regex匹配正确,但仅在粘贴时:
这里当我尝试手动输入它时,它会检查每一个keydown,但是不能同时匹配hello和hello world。正如你所看到的,regex中的输入和上面的一样:
我正在努力与此功能,并将感谢任何有用的建议。
1条答案
按热度按时间gkl3eglg1#
在你的例子中,实际的正则表达式有一些错误。如果
/hello?/gi
是你的正则表达式的输入,考虑以下几点:gi
标志(new RegExp(label, 'gi');
)new RegExp(regex)
或/regex/
。当你把正则表达式放在斜线/hello/
之间时,你使用的是第二种。不要把这两种方法结合起来,它不会起作用的!?
参数。如果你只想匹配一个普通的字符串,而不是一个模式,不要使用正则表达式。你可以,但这是不必要的混淆,可能在计算上要求更高(即较低的性能)。