为什么下面的正则表达式会删除单引号内的边界字符



此代码将直单引号转换为卷曲单引号:

var result = 'This 'is an' example'.replace(/(?<!w)'S(.*?)S'(?!w)/g, '&lsquo;$1&rsquo;')
alert(result)

我以为输出是:

This‘是一个&rsquo的;示例

但输出是这样的:

This‘是的;示例

我不知道为什么要删除引号中的边界字符。

为什么会出现这种情况以及如何修复?

https://jsfiddle.net/gz5wjoqx/

您正在匹配两个S部件,而没有捕获它们:

.replace(/(?<!w)'S(.*?)S'(?!w)/g
//                 ^^     ^^

因此,当你用第一个被引号包围的捕获组替换时:

'&lsquo;$1&rsquo;'
//      ^^

S中的字符不在(.*?)捕获组中,因此它们不包括在$1替换中。

将要替换的所有内容放入捕获组:

var result = 'This 'is an' example'
.replace(
/(?<!w)'(S.*?S)'(?!w)/g,
'&lsquo;$1&rsquo;'
);
console.log(result)

(还要注意,'不需要在模式中转义(

您还可以考虑使用B("不是单词边界"(,而不是w的负面环视,这将使模式与旧浏览器兼容更加简洁:

var result = 'This 'is an' example'
.replace(
/B'(S.*?S)'B/g,
'&lsquo;$1&rsquo;'
);
console.log(result)

最新更新