代码之家  ›  专栏  ›  技术社区  ›  Shayki Abramczyk Cece Dong - MSFT

如何在regex中检测数字之前的字符

  •  3
  • Shayki Abramczyk Cece Dong - MSFT  · 技术社区  · 5 年前

    我有一根绳子 test_demo_0.1.1 .

    我希望在PowerShell脚本中添加到 0.1.1 一些文本,例如: test_demo_shay_0.1.1 .

    我成功地用regex检测到了第一个数字并添加了文本:

    $str = "test_demo_0.1.1"
    if ($str - match "(?<number>\d)")
    {
        $newStr = $str.Insert($str.IndexOf($Matches.number) - 1, "_shay")-
    }
    # $newStr = test_demo_shay_0.1.1
    

    问题是,有时我的字符串在另一个位置包含一个数字,例如: test_demo2_0.1.1 (然后插入不好)。

    所以我想检测前面字符的第一个数字 _ ,我该怎么做?

    我试过 "(_<number>\d)" "([_]<number>\d)" 但它不起作用。

    1 回复  |  直到 5 年前
        1
  •  3
  •   Wiktor Stribiżew    5 年前

    你要求的是积极的 lookbehind (检查W当前位置左侧是否存在某种模式的结构):

    "(?<=_)(?<number>\d)"
     ^^^^^^
    

    不过,您似乎只想插入 _shay 在前面的第一个数字之前 _ . 一 replace 操作在这里最适合:

    $str -replace '_(\d.*)', '_shay_$1'
    

    结果: test_demo_shay_0.1.1 .

    细节

    • γ 下划线
    • (\d.*) -捕获组1:一个数字,然后是行尾的任何0+字符。

    这个 $1 在替换模式中,是捕获组1匹配的内容。