在相邻字符串的特殊字符之间添加 space

Adding space between special chars to adjacent string

我正在使用 Sublime 正则表达式来转换如下文本:

test! one.two .three; four, five . six. .seven

看起来像: test ! one . two . three ; four , five . six . . seven

当我尝试使用捕获组并替换 (\w)([^\w\s]+)|([^\w\s]+)(\w) 使用: (注意 space),字符串完全混乱,一些字符被删除。

test ! one .two hree ; four , five . six . even

奇怪的是,当我分别跳过流水线和 运行 命令(替换 (\w)([^\w\s]+) 后跟 ([^\w\s]+)(\w) 的不同替换)时,结果如预期。

如何管道化 ("or") 正则表达式变体并保持分组?

谢谢!

您正在使用交替使用 4 个捕获组。

查看示例数据,另一种选择可能是使用 2 个捕获组:

(\w+)\h*([^\w\s]+(?:\h+[^\w\s]+)*)\h*

说明

  • (\w+) 捕获 组 1,匹配 1+ 个单词字符
  • \h*匹配0+水平白色space个字符
  • ( 捕获 第 2 组
    • [^\w\s]+ 匹配除单词或白色以外的任何字符space char
    • (?:\h+[^\w\s]+)* 用 1+ 个水平白色 space 字符重复前面的
  • ) 关闭组 2
  • \h* 匹配 0+ 尾随水平白色space 个字符。

Regex demo

在替换中使用

之前(使用 Sublime 3)

之后


或者您可以使用环顾四周来查找可以添加 space:

的位置
(?<=\w)(?=[^\w\s])|(?=\w)(?<=[^\w\s])

Regex demo

仅使用 asertshuns (?<=[^\w\s])(?=\w)|(?<=\w)(?=[^\w\s])
替换为 space

demo