【问题标题】:Regex to convert IBAN to Local format正则表达式将 IBAN 转换为本地格式
【发布时间】:2021-10-22 00:41:05
【问题描述】:

我想用 -replace 在 powershell 中转换以下 iban

来自

HU42 1177 3016 1111 1018 0000 0000

11773016-11111018-00000000

那么我怎样才能编写一个正确的模式来替换第三个空格和第二个空格呢?然后删除所有剩余空间

【问题讨论】:

    标签: regex powershell replace


    【解决方案1】:

    另一种选择

    "{1}{2}-{3}{4}-{5}{6}" -f -split 'HU42 1177 3016 1111 1018 0000 0000'
    

    输出

    11773016-11111018-00000000
    

    【讨论】:

    • 为什么不这样做呢?首先放置“-” 比删除前 4 把椅子 比删除剩余空间? ("HU42 1177 3016 1111 1018 0000 0000" -替换"(^.{14})\s(.{9})\s(.{9})","$1 -$2-$3").remove(0 ,5) - 替换"",""
    • 这很聪明。
    【解决方案2】:
    $Old = "HU42 1177 3016 1111 1018 0000 0000"
    $SplitOld = $old.Split(" ")
    $New = $SplitOld[1] + $SplitOld[2]+ "-" + $SplitOld[3] + $SplitOld[4] + "-" + $SplitOld[5] + $SplitOld[6]
    

    或单行:

    $Old = "HU42 1177 3016 1111 1018 0000 0000"
    $New = $old.Split(" ")[1] + $old.Split(" ")[2]+ "-" + $old.Split(" ")[3] + $old.Split(" ")[4] + "-" + $old.Split(" ")[5] + $old.Split(" ")[6]
    

    【讨论】:

      【解决方案3】:

      您可以使用概念上相当简单的两步 -replace 方法:

      'HU42 1177 3016 1111 1018 0000 0000' -replace '^.+? | ' -replace '(\d{8})(?!$)', '$1-'
      
      • ^.+? | 删除第一个以空格分隔的标记及其后面的空格,以及所有剩余的空格。

      • (\d{8})(?!$) 匹配除字符串末尾的组之外的所有 8 位组($,通过 negative look-ahead assertion(?!...)),并将每个组替换为自身($1,第一次捕获group) 后跟-,从而有效地插入-

      【讨论】:

      • 负前瞻仅在下一个实例与负前瞻语句不匹配时才匹配?
      • @NorbertPozsonyi,如果我理解正确的话,是的。仅当否定前瞻 not 匹配时,否定前瞻前的子表达式才匹配。这里它用于排除 last 8 位数字被匹配。见Zero-Width Negative Lookahead assertions
      • 有时你说明白了,你也证明了,然后重新评论你的不明白……我不明白你的观点。但比你的解决方案!
      • 不客气,@NorbertPozsonyi,但恐怕我也不明白你最近的评论 - 但没关系。
      【解决方案4】:

      您可以像这样使用-split-replace-join 的组合:

      $iban = 'HU42 1177 3016 1111 1018 0000 0000'
      (($iban -split '\s', 2)[-1] -replace '\s') -split '(\d{8})' -ne '' -join '-' 
      

      结果:

      11773016-11111018-00000000
      

      我从你的评论中看到你也想出了一个办法,通过:

      • 首先将“-”字符放在正确的位置
      • 然后删除前 5 个字符(“HU42”)
      • 最后删除剩余的空格字符
      ("HU42 1177 3016 1111 1018 0000 0000" -replace "(^.{14})\s(.{9})\s(.{9})",'$1-$2-$3').Substring(5) -replace " ",""
      

      记住$1-$2-$3 需要用单引号括起来

      【讨论】:

      • 为什么不这样做呢?首先放置“-” 比删除前 4 把椅子 比删除剩余空间? ("HU42 1177 3016 1111 1018 0000 0000" -替换"(^.{14})\s(.{9})\s(.{9})","$1 -$2-$3").remove(0 ,5) - 替换"",""
      • @NorbertPozsonyi 好吧...因为您可以看到,有很多替代方法可以做到这一点。如果您将代码更改为("HU42 1177 3016 1111 1018 0000 0000" -replace "(^.{14})\s(.{9})\s(.{9})",'$1-$2-$3').Substring(5) -replace " ","",它也会起作用。
      • 不知何故我不知道它应该“...”而不是“...”
      【解决方案5】:

      您真的需要使用正则表达式来解决您的问题吗?

      $iban = 'HU42 1177 3016 1111 1018 0000 0000'
      $splitted = -split $iban
      (1,3,5 | ForEach-Object { -join $splitted[$_++, $_] }) -join '-'
      

      Try it online!

      问题越来越像 Code Golf :)

      $iban = 'HU42 1177 3016 1111 1018 0000 0000 1704 2345'
      $l = 0
      -join (
        -split $iban |
        ForEach-Object {
          if( $l -eq 0 ) {
            $r, $l = '', 8
          } else {
            $d = ''
            if( $r.length -eq $l ) {
              $l += 9
              $d = '-'
            }
            $r = "$r$d$_"
          }
        }
      )
      $r
      

      Try it online!

      【讨论】:

      • 你能给我一些关于第二个代码的例子吗? !!$i++ 是什么意思?和它后面的代码。对不起……
      猜你喜欢
      • 1970-01-01
      • 2012-03-27
      • 2011-10-02
      • 2016-04-02
      • 1970-01-01
      • 2019-05-11
      • 2014-11-08
      • 2017-12-29
      • 2023-03-09
      相关资源
      最近更新 更多