javascript - 匹配并替换子字符串,同时忽略特殊字符

标签 javascript regex

我目前正在寻找一种将匹配文本转换为粗体 html 行的方法。除了特殊字符之外,它部分工作,这给我带来了问题,因为我希望保留原始字符串,但不比较原始字符串。

示例:

给定原始字符串:

Taco John's is my favorite place to eat.

并且想要匹配:

is my 'favorite'

要获得所需的结果:

Taco John's <b>is my favorite</b> place to eat.

我目前解决匹配字符串中多余引号的方法是替换它们

let regex = new RegExp('('+escapeRegexCharacters(matching_text.replace(/[^a-z 0-9]/gi,''))+')',"gi")
let html= full_text.replace(/[^a-z 0-9]/gi,'').replace(regex, "<b>$1</b>")}}></span>

这几乎有效,只是我失去了所有标点符号:

Taco Johns <b>is my favorite</b> place to eat

有没有办法使用正则表达式或其他方法在匹配短语周围添加标签,同时在匹配过程中忽略大小写和特殊字符?

更新#1:

看来我说的不清楚了。我需要原始字符串的标点符号保留在最终结果的 html 中。我需要匹配的文本逻辑来忽略所有特殊字符和大写。因此,is my favorite is My favoriteis my 'favorite' 都应该触发匹配。

最佳答案

您可以在正则表达式中在每个要匹配的字符之间注入(inject)一个模式,该模式将跳过可能出现的任何特殊字符,而不是从正在搜索的字符串中删除特殊字符。这样,您就可以构建一个可以直接应用于正在搜索的字符串的正则表达式,并且替换操作将不会触及匹配项之外的特殊字符:

let escapeRegexCharacters = 
         s => s.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"),
    full_text = "Taco John's is My favorite place to eat.";
    matching_text = "is my 'favorite'";
    regex = new RegExp(matching_text.replace(/[^a-z\s\d]/gi, '')
                .split().map(escapeRegexCharacters).join('[^a-z\s\d]*'), "gi"),
    html = full_text.replace(regex, "<b>$&</b>");

console.log(html);

关于javascript - 匹配并替换子字符串,同时忽略特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41270733/

相关文章:

java - 如何使用apache配置库获取属性值和标签值

javascript - Vuejs 将隐藏输入的值设置为路由参数

javascript - react-native:组件不在 .map 中呈现

javascript - 如何将字符添加到 JSON 文件的末尾?

c# - 排除开头但包含结尾

正则表达式匹配所有未用引号引起来的出现并在字符处停止

php - jquery如何获取文本框的当前值

javascript - 条件运算符未正确评估

regex - 将 lst 文件转换为 csv 需要正则表达式帮助

javascript - 如何提取嵌入标签的 src 属性