【问题标题】:How to replace nth character occurence with another character如何用另一个字符替换第n个字符出现
【发布时间】:2018-06-04 18:54:37
【问题描述】:

给定这个字符串:

2017.12.21.5

...如何将其转换为:

2017.12.21-5

匹配总是在. 的第三次出现。

我在 PowerShell 脚本中运行它。

我尝试了太多的排列方式,无法在此处列出;到目前为止,我什至还没有接近。

--编辑--

此外,第二个和第三个八位位组(月份和日期)将在一位到两位数之间变化。第四个(当天的发布)也可能包含三个数字。

【问题讨论】:

    标签: .net regex powershell


    【解决方案1】:

    没有办法定位和替换第 n 次出现的字符,所以我们只需要定位整个字符串并复制未更改的部分

    "2017.12.21.5" -replace '(\d{4}\.\d{2}\.\d{2})\.(\d*)', '$1-$2'
    2017.12.21-5
    

    【讨论】:

    • 行得通,谢谢。但我忽略了在我的问题中提供必要的细节:第二个和第三个八位字节的位数并不总是 2。有没有办法解释这种差异?
    • "2017.12.21.5" -替换'(\d{4}\.\d{1,2}\.\d{1,2})\.(\d*)', '$1​​-$2'
    • 知道了。最后一个 \d 之后的 * 将匹配任意数量的数字,对吗?
    • 没错。如果它总是一定的长度,你可以用一个约束值替换它。我只是这样说,所以它会有一些灵活性。
    • 谢谢。这个正则表达式业务完全让我感到困惑。你对它的掌握如此之好,我印象深刻。
    【解决方案2】:

    您可以使用此正则表达式匹配第三次出现的 .

    (?<=\.\d+\.\d+)\.
    

    【讨论】:

      【解决方案3】:

      你可以使用拆分和加入

      $var='2017.12.21.5'
      $split=$var -split '\.'
      ($split[0..2] -join '.') + '-' + $split[3] 
      

      【讨论】:

        【解决方案4】:

        编辑:我将最后一个函数简化为这个。

        $InputStr = "2017.12.21.5"
        $matchVal = '.'
        $replaceVal='-'
        $num = 3
        
        #searched is:
        $OutputStr=$InputStr
        
        $positions = (0..($InputStr.ToCharArray().Count-2)|ForEach-Object{$InputStr.IndexOf($matchVal,$_)}|Select-Object -Unique)
        if($num -lt $positions.Count+1){
            $OutputStr = $InputStr.Remove($positions[$num-1],1).Insert($positions[$num-1], $replaceVal)
        }
        

        所以它获取$positions$matchVal的所有位置,然后检查$num是否$InputStr 在$position[$num-1] 的字符将被替换为$replaceVal

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-26
          • 1970-01-01
          • 1970-01-01
          • 2013-11-23
          • 1970-01-01
          • 2011-12-19
          • 2011-05-17
          • 1970-01-01
          相关资源
          最近更新 更多