[英]Javascript RegExp for exact multiple words with special characters match
我正在使用 RegExp 進行多個單詞匹配。 它具有動態值,因此當出現像“(”這樣的特殊字符時,它會將其作為表達式並顯示 Uncaught SyntaxError: Invalid regular expression 錯誤。
let text = 'working text and (not working text' let findTerm = ['working text', '(not working text'] let replaceFromRegExp = new RegExp('\\b'+`(${findTerm.join("|")})`+'\\b', 'g') text = text.replace(replaceFromRegExp, match => "<mark>" + match + "</mark>") console.log(text)
您需要通用的詞邊界,在搜索詞之前需要一個非單詞字符或字符串開頭,在搜索字符串之后需要一個非單詞字符或字符串結尾。
請注意,您還需要按長度降序對findTerm
項目進行排序,以避免術語重疊問題。
最后,不要忘記轉義要在正則表達式模式中使用的findTerm
項。
您可以使用
let text = 'working text and (not working text' let findTerm = ['working text', '(not working text'] findTerm.sort((a, b) => b.length - a.length); let replaceFromRegExp = new RegExp(String.raw`(?:\\B(?!\\w)|\\b(?=\\w))(?:${findTerm.map(x => x.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')).join("|")})(?:(?<=\\w)\\b|(?<!\\w)\\B)`, 'g') console.log(replaceFromRegExp) text = text.replace(replaceFromRegExp, "<mark>$&</mark>") console.log(text)
請注意, "<mark>$&</mark>"
是match => "<mark>" + match + "</mark>"
一種簡短表達方式,因為$&
是對整個匹配值的反向引用字符串替換模式。
正則表達式是
/(?:\B(?!\w)|\b(?=\w))(?:\(not working text|working text)(?:(?<=\w)\b|(?<!\w)\B)/g
請參閱正則表達式演示。 詳情:
(?:\\B(?!\\w)|\\b(?=\\w))
- 如果下一個字符不是字字符,則為非字邊界,如果下一個字符是字字符,則為字邊界(?:\\(not working text|working text)
- 與findTerm
數組中設置的替代模式之一匹配的非捕獲組(?:(?<=\\w)\\b|(?<!\\w)\\B)
- 如果前面的字符是單詞字符,則為單詞邊界,如果前面的字符不是字符,則為非單詞邊界字字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.