Java正则表达式需求:替换连续右括号但排除单引号前置场景
我来帮你解决这个正则表达式的问题!你当前的正则之所以不生效,主要有两个问题:一是它会把右括号前面的非单引号字符(比如a)))里的a)也一起替换掉,这不符合你的预期;二是没有正确处理单引号后面的右括号场景。
正确的思路是用负向后行断言,确保我们只匹配那些前面不是单引号的连续右括号。下面是你需要的正则表达式(以Java为例,因为你用了replaceAll方法):
String result = 输入字符串.replaceAll("(?<!')\\)+", ")");
来拆解一下这个正则的各个部分:
(?<!'):这是负向后行断言,它会检查当前匹配位置的前一个字符不是单引号。如果右括号前面是',那么这部分右括号就不会被匹配到。\)+:匹配一个或多个连续的右括号。
我们用你的示例来验证:
- 输入:
a)))→ 三个连续右括号前面是a(不是单引号),会被匹配并替换成单个)→ 输出:a)(符合预期) - 输入:
))))))→ 所有连续右括号前面都不是单引号,被替换成单个)→ 输出:)(符合预期) - 输入:
')))→ 第一个右括号前面是',所以整个连续的右括号都不会被匹配,保留原样 → 输出:')))(符合预期)
如果遇到混合场景比如a'))))),正则会保留单引号后面的所有右括号,最终结果是a'))))),完全符合你的需求。
内容的提问来源于stack exchange,提问作者Mario Mueller
相关产品推荐
相关产品推荐

