簡體   English   中英

Javascript RegExp 用於精確匹配具有特殊字符的多個單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM