【问题标题】:Adding space between special chars to adjacent string在相邻字符串的特殊字符之间添加空格
【发布时间】:2020-06-15 19:33:26
【问题描述】:

我正在使用 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]+),然后对 ([^\w\s]+)(\w) 进行不同的替换),结果与预期的一样。

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

谢谢!

【问题讨论】:

  • 如果 uyr 引擎 suparts assertshuns

标签: regex sublimetext3


【解决方案1】:

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

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

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

解释

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

Regex demo

在替换中使用$1 $2

之前(使用 Sublime 3)

之后


或者您可以使用环视查找可以添加空格的位置:
(?<=\w)(?=[^\w\s])|(?=\w)(?<=[^\w\s])

Regex demo

【讨论】:

  • 非常感谢您提供如此详细的回答。我喜欢 regex101,但由于某种原因,Regex 从未在(我的)Sublime 上工作过,现在也不例外......知道为什么吗?
  • @GavrielGoidel 您是否在 Sublime 中检查了 .* 中的 正则表达式 吗?这是因为您在模式中使用了 4 个捕获组,但在替换中只使用了 2 个。但是,即使您使用一个原子组来使用 2 个捕获组,它也不是正确的替代品。见regex101.com/r/A4bTTp/1
  • 当我向单词部分添加括号时,正则表达式可以完美运行,如下所示:(?
【解决方案2】:

只使用 asertshuns (?&lt;=[^\w\s])(?=\w)|(?&lt;=\w)(?=[^\w\s])
替换为空格

demo

【讨论】: