首页 > 解决方案 > 为什么以下正则表达式会删除单引号内的边界字符?

问题描述

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

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

我认为输出将是:

这是一个例子

但输出是这样的:

这是一个例子

我不确定为什么要删除引号内的边界字符。

为什么会这样以及如何解决?

https://jsfiddle.net/gz5wjoqx/

标签: javascriptregex

解决方案


您正在匹配这两个\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("not a word boundary") 而不是否定环视 for \w,这将使模式与旧浏览器兼容并且更简洁:

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


推荐阅读