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","节点描述"}]
可以看到这样匹配是正确的,使用.来匹配任意字符*?来懒惰匹配只匹配一次。
