用不同的字符替换字符串中的多个点但数量相同

时间:2016-02-08 14:33:07

标签: regex string powershell replace

我有一个如下字符串 “blaa ... blup..blaaa ... BLA。”

每个有多个点的部分必须用“_”替换,但它必须与替换的字符具有相同的数量。

字符串应该导致: “BLA ___ blup__blaaa ___ BLA。”

请注意,最后一个点未被替换,因为它没有其他点“已连接”。

我尝试在powershell中使用以下正则表达式方法,但无论是否有3个或更多点,我总是得到匹配的2:

undefined index

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

您可以使用\G anchor将匹配粘贴到上一个。

\.(?=\.)|\G(?!^)\.
  • \.(?=\.)匹配一个句点(如果另一个句点为ahead
  • |\G(?!^)\.或如果之前有匹配(但未启动)则替换句号

替换为下划线。 See demo at regexstorm

答案 1 :(得分:3)

我所知道的语言和正则表达式都不允许您评估反向引用数值"即时#34;您只能在回调函数中使用它。请参阅Use a function in Powershell replace

但是,在这种特殊情况下,您可以使用以下正则表达式:

((?=\.{2})|(?!^)\G)\.

并替换为_

请参阅regex demo here

enter image description here

并解释:

  • ((?=\.{2})|(?!^)\G) - 与2个点之前的位置匹配的边界((?=\.{2}))或上一次成功匹配的结束(使用(?!^)\G
  • \. - 一个字面点。

答案 2 :(得分:3)

您可以使用以下模式:

\.(?=\.)|(?<=\.)\.

并替换为_

该模式只是查找以句点开头的句号或以句号后跟的句号:

  • \.(?=\.) - 匹配句点后面的句号
  • | - 或
  • (?<=\.)\. - 匹配一个以句号
  • 开头的句号

请参阅online demo