目录
1.2Predefined Character Classes
1.基础概念
正则表达式就是用一组用于描述字符串集合的常用字符。
JDK中支持正则表达式的API位于java.util.regex包下。
java.util.regex里的核心类为Pattern、Matcher。
Pattern设置正则表达式,Matcher设置需要匹配的文本。
1.1Character Classes
字符类用于匹配单个字符。
1.2Predefined Character Classes
java内置了一些预定义的字符类,可以省去我们自己定义的工作。
在使用预定义的字符类之前,需要使用\。
String REGEX = "\\d"; // a single digit
1.3Quantifiers
greedy量词修饰的字符会一次性匹配最高频率的字符,然后根据匹配需要,逐个退出,以寻找可以匹配完整pattern的字符串。
reluctant量词修饰的字符会从最低频率开始匹配字符,然后根据需要,逐渐增加匹配的字符数量,以寻找可以匹配完整pattern的字符串。
possessive量词修饰的字符会一次性匹配最高频率的字符,如果无法匹配完整pattern,也不会逐个退出。
1.4Capturing Groups
Capturing Croups的使用方法是,括号()。
eg:(abc)
使用Capturing Groups可以将多个字符作为一个单元使用。
一个正则表达式中的Capturing Groups的数量由正则表达式中的括号数量决定。
eg:(a(nc)(cc(s)))中有4个Capturing Groups
一个正则表达式中有多个Capturing Group时,Capturing Groups会被编号,编号的规则为从左到右,按照左括号出现的位置从1开始,依次编号。
可以使用\num的方法回调Capturing Groups,因为每一个匹配成果的Capturing Groups都会保存在内存中。
eg:(\d(\d(\d)))\2 可以匹配 12323。
1.5Boundary Matchers
边界映射用于控制映射发生的位置,eg:令映射发生在句首。
\b用来映射单词
eg:\bdog\b 可以映射 "a dog ."中的"dog",无法映射出"a doggsadf"中的"dog"
2.Pattern类的方法
Pattern用于设置正则表达式。
Pattern对象不能使用构造器直接获取,而是通过静态工厂方法compile来生成。
Pattern pattern = Pattern.compile("aaa");
note:创建一个正则表达式为"aaa"的Pattern对象。
使用Pattern标识(创建时)
可以在创建Pattern对象时,设置标志。
Pattern pattern = Pattern.compile(line, Pattern.CASE_INSENSITIVE);
使用Pattern标识(编写正则表达式时)
使用内置标识表达式编写正则表达式
eg:正则表达式:(?i)foo,输入字符串:"FOOfooFoOfoO",结果可以映射四次。
快速检测正则表达式与输入字符串是否对应
boolean flag = Pattern.matches("\\d", "111");
ps:输入的正则表达式与输入字符串必须完整匹配,eg:"\\d"与"111"返回false,"\\d{3}"与"111"返回true。
切分字符串
String[] items = pattern.split(INPUT);
将输入字符串转化为对应的字符串字面值正则表达式
String regex = Pattern.quote("111");
note:转化的字符串为"\Q111\E"。
获取Pattern对象中编辑的正则表达式
String regex = pattern.toString();
3.String类的方法
快速检测正则表达式与字符串是否对应
String index = "111";
boolean flag = index.matches("\\d{3}");
ps:此方法与Pattern.matches(regex, input)等价。
切分字符串
String input = "one2two"
String[] items = input.split("\\d", 0);
ps:该方法的第二个参数limit为一个int,用于设置映射次数,即设置为n时,使用正则表达式映射n-1次,最多得到n个子串。如果limit设置为负数或为zero,则得到最大切分结果。
切分字符串
String input = "one2two"
String[] items = input.split("\\d");
替换字符串中内容
String origin = "one1two";
String ans = origin.replace("1", " ");
note:得到字符串origin中"1"被替换成" "之后的新字符串,"one two"
ps:第一个参数target为字符串,而不是正则表达式。即这个方法与正则表达式没关系。
4.Matcher类的方法
Matcher对象不能使用构造器创建,应该使用已存在的Pattern对象的matcher方法获取。
Matcher matcher = pattern.matcher(line);
index方法
public int start():返回刚刚匹配到的字符串的首字符位置。
public int end():返回刚刚匹配到的字符串的尾字符之后的位置。
public int start(int group):返回刚刚匹配到的字符串中的指定group的首字符位置。
public int end(int group):返回刚刚匹配到的字符串中的指定group的尾字符之后的位置。
study方法
用于检阅输入字符串,并返回boolean类型值,判断匹配是否成功。
public boolean lookingAt():判断输入字符串首与正则表达式是否匹配。
public boolean matches():判断输入字符串与正则表达式是否完整匹配。
public boolean find():找寻一个与正则表达式匹配的子字符串,找到了返回true。ps:一般将此方法作为while循环的条件,用来遍历所有找到的子字符串。
public boolean find(int start):找寻一个与正则表达式匹配的子字符串,从start设置的index开始查找。
获取被匹配到的子字符串(String方法)
input.substring(matcher.start(), matcher.end());
获取被匹配到的子字符串(matcher方法)
matcher.group();
将输入字符串中的首个被匹配到的子字符串替换:
String ans = matcher.replaceFirst(replace);
ps:String的replaceFirst方法与之等价,源代码调用了此方法。
将输入字符串中的全部匹配子字符串替换:
String ans = matcher.replaceAll(replace);
ps:String的replaceAll方法与之等价,源代码调用了此方法。
public Matcher appendReplacement(StringBuffer sb, String replacement):
将输入字符串中被匹配到的子串添加到sb之中,然后将replacement继续添加到sb之后。此方法与find()类似,每一使用都会对下一次匹配执行。
public StringBuffer appendTail(StringBuffer sb):
将输入字符串中上一次匹配之后的字符全部添加进sb之中。此方法可以与appendReplacement方法搭配适合,达到replaceAll方法的效果。
while(matcher.find()) {
matcher.appendReplacement(sb, replace);
}
matcher.appendTail(sb);
更详细的教程:Java tutorial 正则表达式篇