一个\b
单词边界匹配任何以下三个位置:
- 在字符串中的第一个字符之前,如果第一个字符是单词字符。
- 在字符串的最后一个字符之后,如果最后一个字符是单词字符。
- 在字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。您需要通用的词边界,在搜索词之前需要一个非单词字符或字符串开头,在搜索字符串之后需要一个非单词字符或字符串结尾。
请注意,您还需要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')
// If the boundaries for special chars should not be checked remove \B:
// let replaceFromRegExp = new RegExp(String.raw`(?:(?!\w)|\b(?=\w))(?:${findTerm.map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join("|")})(?:(?<=\w)\b|(?<!\w))`, '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
或者
/(?:(?!\w)|\b(?=\w))(?:\(not working text|working text)(?:(?<=\w)\b|(?<!\w))/g
请参阅正则表达式 #1 演示和正则表达式 #2 演示。详情:
(?:\B(?!\w)|\b(?=\w))
- 如果下一个字符不是字字符,则为非字边界,如果下一个字符是字字符,则为字边界
(?:(?!\w)|\b(?=\w))
- 下一个字符必须是非字字符,或者当前位置左边不能有字符字符,下一个字符必须是字符字符(如果术语以特殊字符开头,则无边界)是必须的)
(?:\(not working text|working text)
- 与findTerm
数组中设置的替代模式之一匹配的非捕获组
(?:(?<=\w)\b|(?<!\w)\B)
- 如果前面的字符是字字符,则为字边界,如果前面的字符不是字字符,则为非字边界
(?:(?<=\w)\b|(?<!\w))
- 如果前一个字符是字字符,则下一个字符不能是字符字符,或者前一个字符不应是字符字符(如果术语以特殊字符结尾,则不需要边界)