一、相关类
位于java.util.regex包下面
- 类Pattern:
正则表达式的编译表示形式:
Pattern p = Pattern. compile(regx) ; //建立正则表达式,并启用相应模式- 类Matcher:
Matcher m = p.matcher(str); //匹配str字符串
- 类PatternSyntaxException
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
二、捕获组
在表达式(A)(B(C)),中有以下三组:
group(1):(A)
group(2):(B(C))
group(3):(C)
group(1):(A)
group(2):(B(C))
group(3):(C)
注:还有一个特殊的组
group(0),它总是代表
整个表达式。该组不包括在 groupCount 的返回值中。
public class RegexMatches{
public static void main( String args[] ){
// 按指定模式在字符串查找
String line = "This is hj sdfsd tt ERT21445! OK?";
String regex = "(\\D*)(\\d+)(.*)";//(非数字*)(数字+)(除了换行符的任意字符*)
// 创建 Pattern 对象
Pattern r = Pattern.compile(regex);
// 现在创建 matcher 对象
Matcher m = r.matcher(line);
if (m.find( )) {
System.out.println("group(0): " + m.group(0) );
System.out.println("group(1): " + m.group(1) );
System.out.println("group(2): " + m.group(2) );
} else {
System.out.println("匹配结束");
}
}
}
运行结果:
group(0): This is hj sdfsd tt ERT21445! OK?
group(1): This is hj sdfsd tt ERT
group(2): 21445
group(1): This is hj sdfsd tt ERT
group(2): 21445
三、Matcher 类的方法
索引方法
索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:
序号 | 方法及说明 |
---|---|
1 | public int start() 返回以前匹配的初始索引。 |
2 | public int start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引 |
3 | public int end() 返回最后匹配字符之后的偏移量。 |
4 | public int end(int group) 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。 |
public class RegexMatches {
public static void main(String args[]) {
String regex = "\\bcat\\b";
String str = "cat cat cat cattie cat";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str); // 获取 matcher 对象
int count = 0;
while (m.find()) {
count++;
System.out.println("------------");
System.out.println("Match number " + count);
System.out.println("start(): " + m.start());
System.out.println("end(): " + m.end());
System.out.println("str: " + str.substring(m.start(),m.end()));
}
}
}
运行结果:
------------
Match number 1
start(): 0
end(): 3
str: cat
------------
Match number 2
start(): 4
end(): 7
str: cat
------------
Match number 3
start(): 8
end(): 11
str: cat
------------
Match number 4
start(): 19
end(): 22
str: cat
lookingAt和matches的例子:
Match number 1
start(): 0
end(): 3
str: cat
------------
Match number 2
start(): 4
end(): 7
str: cat
------------
Match number 3
start(): 8
end(): 11
str: cat
------------
Match number 4
start(): 19
end(): 22
str: cat
研究方法
研究方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:
序号 | 方法及说明 |
---|---|
1 | public boolean lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配。 |
2 | public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。 |
3 | public boolean find(int start) 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 |
4 | public boolean matches() 要求整个序列都匹配 |
public class RegexMatches {
public static void main(String args[]) {
String regex = "abb";
String str = "abbbbbbbbbbbbbbb";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str); // 获取 matcher 对象
System.out.println(m.matches());//要求整个序列都匹配
System.out.println(m.lookingAt());//不要求整个序列都匹配,从起始位置开始匹配上即可
}
}
运行结果:
false
true
appendReplacement和appendTail的例子:
替换方法
替换方法是替换输入字符串里文本的方法:
序号 | 方法及说明 |
---|---|
1 | public Matcher appendReplacement(StringBuffer sb, String replacement) 实现非终端添加和替换步骤。 |
2 | public StringBuffer appendTail(StringBuffer sb) 实现终端添加和替换步骤。 |
3 | public String replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。 |
4 | public String replaceFirst(String replacement) 替换模式与给定替换字符串匹配的输入序列的第一个子序列。 |
5 | public static String quoteReplacement(String s) 返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。 |
public class RegexMatches {
public static void main(String args[]) {
String regex = "a*b";
String str = "wwwaabxxxxaaabyyyaaabzz";
String replaceStr = "=";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str); // 获取 matcher 对象
StringBuffer sb = new StringBuffer();
int count = 0;
while (m.find()) {
count++;
//1.将每次匹配的子字符串替换为指定的字符串, 如:aab换成=
//2.并将上次匹配的字符串之后的字符串和替换后的子串添加的sb里,如:www=
m.appendReplacement(sb, replaceStr);
System.out.println("第"+count+"次sb:"+sb.toString());
}
//将最后一次匹配之后的字符串添加到sb里
m.appendTail(sb);
System.out.println("最后sb:"+sb.toString());
}
}
运行结果:
第1次sb:www=
第2次sb:www=xxxx=
第3次sb:www=xxxx=yyy=
最后sb:www=xxxx=yyy=zz
第2次sb:www=xxxx=
第3次sb:www=xxxx=yyy=
最后sb:www=xxxx=yyy=zz