提出问题
通过正则表达式,提取下面字符串中,包含 美元+数字 的字符串,如下:
$100, $130, $150
提取的正则表达式:
$\d\d\d
完整代码如下:
String text = "$100, $130, $150";
String patternStr = "$100";
Matcher matcher = Pattern.compile(patternStr).matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
执行结果找不到字符串
分析问题
因为 $ 是正则表达式的符号之一,表示 匹配字符串的结束,详见链接
解决方法一
使用转移符号 \$,完整正则表达式:\\$\\d\\d\\d,完整代码如下:
String text = "$100, $130, $150";
String patternStr = "\\$\\d\\d\\d";
Matcher matcher = Pattern.compile(patternStr).matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
执行结果:
$100
$130
$150
缺点
需要手动转移,复杂正则表达式容易出错
解决
使用 Pattern.quote() 方法
Pattern.quote()
先看下面代码
String text = "$100, $130, $150";
String patternStr = Pattern.quote("$") + "\\d\\d\\d";
System.out.println("正则表达式:"+patternStr);
Matcher matcher = Pattern.compile(patternStr).matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
执行结果:
正则表达式:\Q$\E\d\d\d
$100
$130
$150
解释
Pattern.quote("$") 就是在字符串 $ 的前面加上 \Q,后面加上 \E,表示此 $ 是普通字符串,不是正则表达式
\Q、\E 解释
\Q:代表字面内容的开始\E:代表字面内容的结束
参考:https://www.baeldung-cn.com/java-pattern-quote