首页 > 解决方案 > 在相邻字符串的特殊字符之间添加空格

问题描述

我正在使用 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))时,结果符合预期。

如何管道(“或”)正则表达式变体并保持分组?

谢谢!

标签: regexsublimetext3

解决方案


您正在使用交替使用 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])

正则表达式演示


推荐阅读