我有一种情况,我希望正则表达式更改字母"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演示