java中正则表达式的使用与懒惰匹配和贪婪匹配
java正则表达式基础
正则表达式用来匹配特定字符串,对于需要替换掉特定字符中的特定字符串如html标签,需要注意正则表达式的懒惰匹配和贪婪匹配,懒惰匹配匹配第一个不影响后续匹配,贪婪匹配配匹所有符合的结果。
基本用法
-
中括号[]
- 用来匹配中括号的单个字符,如a[hjkl]c可匹配 ahc,ajc,akc,alc,注意只匹配单个字符,不可匹配ahjc等。
-
英文点符号 '.'
- 用来匹配任意单个字符,如a.b,可匹配a1b,a#b等单个字符。
-
或符号 |
- 相当于或,a[b|cd|e]f ,可匹配 abf,acdf,aef.
-
匹配次数
- *: 匹配任意次数。
- ?:匹配0次或1次
- +:匹配1次或多从
- {n}:匹配n次
- {n,m}:匹配n到m次
懒惰匹配与贪婪匹配
懒惰匹配在代码中非常常用,向需要匹配替换掉json串中的某个属性时,我们就要使用*?来避免贪婪匹配。其主要区别在于贪婪匹配会匹配所有符合条件的,懒惰匹配只匹配一次。下面使用代码来说明
1.首先看错误示例。
public class Main {
public static void main(String[] args) {
String jsonstr = "[{\"nodename\":\"任意名称\",\"nodedesc\",\"节点描述\"}]";
String regex = "\"nodename\":\".*\",";
System.out.println(jsonstr.replaceAll(regex,""));
}
}
结果输出为:[{"节点描述"}]
这次匹配的结果是我们意料之外的,我们只想去掉nodename这一个属性,但是却连nodedesc:也匹配掉了,这就是贪婪匹配,匹配最大次满足的字符。
2.正确是咧
public class Main {
public static void main(String[] args) {
String jsonstr = "[{\"nodename\":\"任意名称\",\"nodedesc\",\"节点描述\"}]";
String regex = "\"nodename\":\".*?\",";
System.out.println(jsonstr.replaceAll(regex,""));
}
}
结果输出为:[{"nodedesc","节点描述"}]
可以看到这样匹配是正确的,使用.来匹配任意字符*?来懒惰匹配只匹配一次。