javascript TypeScript中的RegEx循环行为-Angular

xjreopfe  于 2022-12-10  发布在  Java
关注(0)|答案(1)|浏览(165)

我有一个奇怪的问题与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中的输入和上面的一样:

我正在努力与此功能,并将感谢任何有用的建议。

gkl3eglg

gkl3eglg1#

在你的例子中,实际的正则表达式有一些错误。如果/hello?/gi是你的正则表达式的输入,考虑以下几点:

  • 您的正则表达式函数已经具有这些gi标志(new RegExp(label, 'gi');
  • 在javascript中有两种使用正则表达式的方法,new RegExp(regex)/regex/。当你把正则表达式放在斜线/hello/之间时,你使用的是第二种。不要把这两种方法结合起来,它不会起作用的!
  • 你的正则表达式的唯一匹配部分有一个问号。这基本上意味着你的正则表达式不需要匹配任何东西(我不知道你的浏览器是否知道如何正确处理这个问题,我认为这个正则表达式可能是无效的)。因为它应该匹配'hello'或者什么都不匹配,你应该删除?参数。

如果你只想匹配一个普通的字符串,而不是一个模式,不要使用正则表达式。你可以,但这是不必要的混淆,可能在计算上要求更高(即较低的性能)。

相关问题