繁体   English   中英

匹配和替换子字符串同时忽略特殊字符

[英]Match and replace a substring while ignoring special characters

我目前正在寻找一种将匹配文本转换为粗体 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'应该都触发匹配。

正则表达式在有模式的地方很有用,但是,在这种情况下,你有一个直接匹配,所以,好的方法是使用String.prototype.replace

function wrap(source, part, tagName) {

  return source
    .replace(part, 
      `<${tagName}>${part}</${tagName}>`
    )
  ;
}

至少,如果有模式,你应该编辑你的问题并提供它。

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

 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(/[^az\\s\\d]/gi, '') .split().map(escapeRegexCharacters).join('[^az\\s\\d]*'), "gi"), html = full_text.replace(regex, "<b>$&</b>"); console.log(html);

可以避免使用带有$&替换字符串的捕获组,这意味着“整个匹配的子字符串”:

var phrase = "Taco John's is my favorite place to eat."
var matchingText = "is my favorite"

var re = new RegExp(escapeRegexCharacters(matchingText), "ig");
phrase.replace(re, "<b>$&</b>");

(基于 obarakon 的答案的代码。)

概括地说,您可以使用的正则表达式is my /w+ 您可以在替换器函数中使用它,以便您可以使用 javascript 操作结果文本:

 var str = "Taco John's is my favorite place to eat."; var html = str.replace(/is my \\w*/, function (x) { return "<b>" + x + "</b>"; } ); console.log(html);

作为一个选项,对于单次出现的情况 - 使用String.split
将“ ### ”替换为“ @@@ ”的示例:

let inputString = '1234###5678'
const chunks = inputString.split('###')
inputString = `${chunks[0]}@@@${chunks[1]}`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM