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

时间:2016-12-21 19:43:19

标签: 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:

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

5 个答案:

答案 0 :(得分:1)

在有模式的情况下,正则表达式很有用,但是,在这种情况下,您有直接匹配,因此,好的方法是使用String.prototype.replace

function wrap(source, part, tagName) {

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

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

答案 1 :(得分:1)

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

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);

答案 2 :(得分:0)

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

.kv

(基于obarakon答案的代码。)

答案 3 :(得分:0)

概括,您可以使用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);

答案 4 :(得分:0)

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

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