正则表达式用美元符号替换字符串,奇怪的输出

时间:2016-06-04 19:01:51

标签: javascript regex

我使用javascript函数如下将html blockquote转换为markdown blockquote:

flex-direction: row-reverse

所以,如果我传入: function convertBlockquote(str) { var r = str; var pat = /<blockquote>\n?([\s\S]*?)\n?<\/blockquote>/mi; //[\s\S] = dotall; ? = non-greedy match for (var mat; (mat = r.match(pat)) !== null; ) { mat = mat[1] .replace(/\n/gm, '\n> ') .replace(/<p>/igm, '\n> ') .replace(/<\/p>/igm, '\n> \n> ') .replace(/(\n> ?){3,}/gm, '\n> \n> '); r = r.replace(pat, '\n>' + mat + '\n'); } return r; }
我希望:<blockquote>Price: $1000 plus tax.</blockquote>
但我得到:> Price: $1000 plus tax.

注意它是如何用整个原始字符串替换字符串的$ 1000部分中的> Price: Price: $1000 plus tax.000 plus tax.

如何逃避此操作或更新函数来处理此问题(以及可能导致类似问题的其他特殊字符)?

2 个答案:

答案 0 :(得分:1)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

  

您可以将函数指定为第二个参数。在这种情况下,将在执行匹配后调用该函数。函数的结果(返回值)将用作替换字符串。 (注意:在这种情况下,上述特殊替换模式适用。)

所以你可以写

r = r.replace(pat, function () { return '\n>' + mat + '\n'; });

答案 1 :(得分:0)

我是否遗漏了一些明显或实施看起来很复杂的事情?

我就是这样做的:

str=str.replace(/<blockquote>(.*?)<\/blockquote>/g,'> $1')

如果您希望匹配多行引号:

str=str.replace(/<blockquote>((.|\n)*?)<\/blockquote>/g,'> $1')