javascript - 为什么以下正则表达式会删除单引号内的边界字符?
问题描述
此代码将直单引号转换为弯单引号:
var result = 'This \'is an\' example'.replace(/(?<!\w)\'\S(.*?)\S\'(?!\w)/g, '‘$1’')
alert(result)
我认为输出将是:
这是一个例子
但输出是这样的:
这是一个例子
我不确定为什么要删除引号内的边界字符。
为什么会这样以及如何解决?
解决方案
您正在匹配这两个\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
("not a word boundary") 而不是否定环视 for \w
,这将使模式与旧浏览器兼容并且更简洁:
var result = 'This \'is an\' example'
.replace(
/\B'(\S.*?\S)'\B/g,
'‘$1’'
);
console.log(result)
推荐阅读
- batch-file - 如何在vbs中将字符串添加到传递的参数中
- javascript - 我的 js 代码有什么问题。结果总是不确定的?
- javascript - JavaScript 函数在 AJAX XML HttpRequest 之后不起作用
- sql - Role of null in performance tuning
- javascript - Xpath 返回下元素的空值
标签 - python - PermissionError 仅在第一次引发 - pd.ExcelWriter.save()
- c++ - 如何匹配环境不同的两组?C++
- java - 减少 Hibernate 存储库中的样板代码/在桌面客户端-服务器应用程序中使用 Spring 的 JpaRepository 接口
- ios - 在真实设备上获取位置不起作用
- twilio - 特维利奥
错误:DTMF 消息中没有 callid