有一种情况是,如果字母"O“出现在字符串的前4个字符中,我希望正则表达式将其更改为数字"0”。
示例:应将BO1A6987更改为B01A6987
我成功地使用了O(?<=^.{0,4}),但我现在需要在表达式中加入一个新元素,我不清楚如何做到这一点。
我需要忽略任何字符串,其中前4个字符是SPOC,但5-8个字符应该有任何字母"O“替代数字"0”。
示例:应将SPOCBO1A6987更改为SPOCB01A6987
发布于 2021-03-26 01:19:31
也许你可以试试:
^((?:SPOC)?.{0,3})O并替换为${1}0。查看在线demo
^ -开始行anchor.( -打开第一个捕获组:(: -打开非捕获组:SPOC -匹配"SPOC“literally.)? -关闭非捕获组并将其设置为optional.- `.{1,3}` - Capture 0-3 characters other than newline.
- `)` - Close 1st capture group.O -捕获大写“O”。替换是通过对我们的第一个捕获组的反向引用来完成的,但您不能简单地使用$1,因为我们需要在它后面跟一个零,引擎可能会认为您引用的是第10个捕获组。因此,使用花括号将反向引用括起来。
您还可以参考this .Net演示。
编辑:
上面的代码只处理一个实例。我猜,如果你想替换第一到第四个位置或第五到第八个位置中的所有实例,你可以尝试:
(?<=^(?:SPOC)?.{0,3})(?<!^SP(?=OC))O其中:
(?<= -打开正向回溯:^ -开始行anchor.(?:SPOC)? -可选捕获"SPOC"..{0,3} - 0-3个字符,而不是newline.) -关闭正向lookbehind.(?<! -打开负向后视:^ -开始行anchor.SP -匹配"SP“literally.(?= -打开正向前视:OC -匹配"OC”literally.) -关闭正向lookahead.- `)` - Close negative lookahead.O -捕获大写“O”。现在只需将其替换为零。请参阅.Net demo
发布于 2021-03-26 05:20:23
使用后视的另一种选择可能是:
向左声明字符串的开头,后面不跟SPOC,匹配任意字符0-3次,或者向左声明字符串的开头,后面跟着SPOC,匹配任意字符0-3次。
在断言匹配O之后
(?<=^(?!SPOC).{0,3}|^SPOC.{0,3})O模式匹配:
(?<=正向查找字符串的开头,直接向右声明^(?!SPOC).{0,3} times| OR^SPOC.{0,3},并匹配字符串的任意字符0-3 times开头和字符串的任意字符0-3字符
) Close lookbehindO Match字面意思是Regex demo
如果要替换前8个字符中的所有O,可以将限定符更改为{0,7}
(?<=^(?!SPOC).{0,7}|^SPOC.{0,3})ORegex demo
https://stackoverflow.com/questions/66804349
复制相似问题