正则表达式.Net



我有一种情况,我希望正则表达式更改字母"O〃;到一个数字"0";0";如果它出现在字符串的前4个字符中。

示例:BO1A6987应更改为B01A6987

我成功地使用了O(?<=^.{0,4}(,但我现在需要在表达式中加入一个新元素,我不清楚如何做到这一点。

我需要忽略前4个字符是SPOC但5-8个字符应该有任何字母"的任何字符串;O〃;替换为数字";0〃;。

示例:SPOCBO1A6987应更改为SPOCB01A6987

也许你可以试试:

^((?:SPOC)?.{0,3})O

并替换为${1}0。查看在线演示

  • ^-起始线锚
  • (-打开第一个捕获组:
    • (:-打开非捕获组:
      • SPOC-匹配";SPOC";从字面上看
      • )?-关闭非捕获组并将其设为可选
    • .{1,3}-捕获除换行符以外的0-3个字符
    • )-关闭第一个捕获组
  • O-捕获一个大写的";O〃

替换是通过对我们的第一个捕获组的反向引用来完成的,但您不能简单地使用$1,因为我们需要用零来跟踪它,并且引擎可能认为您指的是第十个捕获组。因此,在backreference周围使用大括号。

您也可以参考这个.Net演示。


编辑:

以上仅处理一次出现。我想如果你想替换在第1-4个位置或在第5-8个位置的所有出现;SPOC";,你可以试试:

(?<=^(?:SPOC)?.{0,3})(?<!^SP(?=OC))O

其中:

  • (?<=-打开正向后备:
    • ^-起始线锚
    • CCD_ 14-任选地捕获";SPOC">
    • .{0,3}-0-3换行符以外的字符
    • )-关闭正向后备
  • (?<!-打开负后备:
    • ^-起动线锚
    • CCD_ 19-匹配";SP";从字面上看
    • (?=-开启正向前瞻:
      • OC-匹配";OC";从字面上看
      • )-关闭正向展望
    • )-关闭负面展望
  • CCD_ 24-捕获一个大写的";O〃

现在只需将其替换为零即可。参见.Net演示

另一个使用查找的选项可能是:

断言字符串的左边开头不跟SPOC并匹配任何字符0-3次,或者断言字符串的右边开头跟SPOC并匹配任意字符0-3倍。

断言匹配后O

(?<=^(?!SPOC).{0,3}|^SPOC.{0,3})O

模式匹配:

  • (?<=正向后备
    • ^(?!SPOC).{0,3}字符串的开头,直接向右断言非SPOC,并匹配任何字符0-3次
    • |
    • ^SPOC.{0,3}字符串的开始并匹配任意字符0-3次
  • )近距离观察
  • O按字面匹配

Regex演示

如果您想替换前8个字符中的所有O,可以将量词更改为{0,7}

(?<=^(?!SPOC).{0,7}|^SPOC.{0,3})O

Regex演示

最新更新