此代码将直单引号转换为卷曲单引号:
var result = 'This 'is an' example'.replace(/(?<!w)'S(.*?)S'(?!w)/g, '‘$1’')
alert(result)
我以为输出是:
This‘是一个&rsquo的;示例
但输出是这样的:
This‘是的;示例
我不知道为什么要删除引号中的边界字符。
为什么会出现这种情况以及如何修复?
https://jsfiddle.net/gz5wjoqx/
您正在匹配两个S
部件,而没有捕获它们:
.replace(/(?<!w)'S(.*?)S'(?!w)/g
// ^^ ^^
因此,当你用第一个被引号包围的捕获组替换时:
'‘$1’'
// ^^
S
中的字符不在(.*?)
捕获组中,因此它们不包括在$1
替换中。
将要替换的所有内容放入捕获组:
var result = 'This 'is an' example'
.replace(
/(?<!w)'(S.*?S)'(?!w)/g,
'‘$1’'
);
console.log(result)
(还要注意,'
不需要在模式中转义(
您还可以考虑使用B
("不是单词边界"(,而不是w
的负面环视,这将使模式与旧浏览器和兼容更加简洁:
var result = 'This 'is an' example'
.replace(
/B'(S.*?S)'B/g,
'‘$1’'
);
console.log(result)