IntelliJ中Regex编译问题:replaceFirst("{}")为何出现编译错误?
为什么
replaceFirst("{}", ...)会出现错误? 嘿,这个问题我之前也踩过坑!核心原因是你没注意到replaceFirst方法的第一个参数是正则表达式,不是普通的字面字符串!
问题根源
虽然"{}"本身是合法的Java字符串,但在正则语法里,{和}是用来定义重复次数的量词(比如\d{3}匹配3个连续数字)。单独写{}完全不符合正则语法规则——正则引擎会期待在{后面看到数字(比如{2}、{1,5}),所以它根本无法解析这个表达式。
你提到的“编译错误”,其实大概率是IntelliJ IDEA 2018.1的静态代码检查提示(它会提前识别无效的正则表达式并给出警告,看起来像编译错误)。严格来说这段代码能通过编译,但运行时会直接抛出PatternSyntaxException,提示类似Illegal repetition的错误信息。
解决方案
要匹配字面量的{},你需要把这些正则特殊字符转义,有两种简单的方法:
手动转义:在正则中,特殊字符需要用
\转义,而Java字符串里的\本身需要转义,所以要写成两个\\:uri = uri.replaceFirst("\\{\\}", param.toString());自动转义(推荐):使用
Pattern.quote()方法,它会自动把传入的字符串转换成正则的字面量匹配模式,不用手动处理转义:import java.util.regex.Pattern; // ... uri = uri.replaceFirst(Pattern.quote("{}"), param.toString());
这样就能正确替换字符串中的{}啦!
内容的提问来源于stack exchange,提问作者Sachin Verma
相关产品推荐
相关产品推荐

