【问题标题】:Replace multiple dots in string with different character but same amount用不同字符但相同数量替换字符串中的多个点
【发布时间】:2016-05-18 06:16:50
【问题描述】:

我有一个类似下面的字符串 “blaa...blup..blaaa...bla。”

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

该字符串应导致: “bla___blup__blaaa___bla。”

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

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

$string -replace '(.)\1+',("_"*'$&'.length)

有什么想法吗?

【问题讨论】:

  • @PetSerAl:为什么?只需一个正则表达式即可轻松解决。
  • @WiktorStribiżew 鉴于 OP 代码,我认为这是他想要做的,所以我投票赞成。
  • 是的,没错。我会在我的回答中添加一个注释。
  • 感谢所有的答案,我可以用这个解决我的问题。

标签: regex string powershell replace


【解决方案1】:

您可以使用\G anchor 将匹配项粘合到前一个。

\.(?=\.)|\G(?!^)\.
  • \.(?=\.) 匹配一个句点,如果另一个句点是 ahead
  • |\G(?!^)\. 或替换句点,如果有前一场比赛(但没有开始)

替换为下划线。 See demo at regexstorm

【讨论】:

  • :) 替代品的好选择 :) 你的建议似乎是最好的。
【解决方案2】:

您可以使用以下模式:

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

并替换为_

该模式只是查找前面有句点的句点或后面跟着句点的句点:

  • \.(?=\.) - 匹配一个句点后跟一个句点
  • | - 或者
  • (?&lt;=\.)\. - 匹配前面有句点的句点

请参阅online demo

【讨论】:

    【解决方案3】:

    我所知道的所有语言和正则表达式都不允许您“即时”评估反向引用数值,您只能在回调函数中使用它。见Use a function in Powershell replace

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

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

    并替换为_

    请参阅regex demo here

    以及解释:

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

    【讨论】:

    • @Shihan:bobble bubble 的建议是最有效的,尽管这里的所有正则表达式都按您的预期工作。
    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2011-04-28
    • 2022-12-15
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-18
    相关资源
    最近更新 更多