regex - 在相邻字符串的特殊字符之间添加空格
问题描述
我正在使用 Sublime 正则表达式来转换如下文本:
test! one.two .three; four, five . six. .seven
看起来像:
test ! one . two . three ; four , five . six . . seven
当我尝试使用捕获组并替换为(\w)([^\w\s]+)|([^\w\s]+)(\w)
:($1 $2
注意空格)时,字符串完全搞砸了,一些字符被删除了。
test ! one .two hree ; four , five . six . even
奇怪的是,当我跳过流水线并单独运行命令(替换(\w)([^\w\s]+)
后跟一个不同的 replace for ([^\w\s]+)(\w)
)时,结果符合预期。
如何管道(“或”)正则表达式变体并保持分组?
谢谢!
解决方案
您正在使用交替使用 4 个捕获组。
查看示例数据,另一种选择可能是使用 2 个捕获组:
(\w+)\h*([^\w\s]+(?:\h+[^\w\s]+)*)\h*
解释
(\w+)
捕获组 1,匹配 1+ 单词字符\h*
匹配 0+ 个水平空白字符(
捕获组 2[^\w\s]+
匹配除单词或空格字符之外的任何字符(?:\h+[^\w\s]+)*
重复前面的 1+ 水平空白字符前置
)
关闭组 2\h*
匹配 0+ 个尾随水平空白字符。
在更换使用$1 $2
之前(使用 Sublime 3)
后
或者您可以使用环视查找可以添加空格的位置:
(?<=\w)(?=[^\w\s])|(?=\w)(?<=[^\w\s])
推荐阅读
- java - 如何自定义 GraphQL 查询验证错误消息
- django - 在 Wagtail 中注册后自动将用户添加到组
- php - 将订单号添加到子元素,1,2,3,4,5
- ffmpeg - FFmpeg Concat 过滤器高内存使用情况
- matlab - 如何在 matlab 中创建具有这些条件的矩阵?
- vim - 如何使用 vim 有条件地替换数字
- javascript - 为什么这个生命周期钩子代码会工作两次?
- python - 阶乘的迭代动态规划效果很好,但它违反了 dp 的定义,因为阶乘中没有重叠的子问题
- bixby - 如何在调试视图中展开 INTENT 卡?
- angular - Angular 8 build - 休息端点问题