目录
appendReplacement 和 appendTail 方法
为什么要使用正则表达式?
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。(例如判断字符串是否符合规范等)
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
正则表达式的语法
如何使用正则表达式
java.util.regex 包主要包括以下三个类:
- Pattern 类:
pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。
Pattern p = Pattern.compile(REGEX);
- Matcher 类:
Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
Matcher m = p.matcher(INPUT);
- PatternSyntaxException:
PatternSyntaxException 是一个非强制异常类,它表示一个正则表达式模式中的语法错误。
MATCHER类的方法
Matcher 类的方法 | ||
索引方法 | ||
public int start() | 返回以前匹配的初始索引。 | |
public int start(int group) | 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引 | |
public int end() | 返回最后匹配字符之后的偏移量。 | |
public int end(int group) | 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。 | |
查找方法 | ||
public boolean lookingAt() | 尝试将从区域开头开始的输入序列与该模式匹配。 | |
public boolean find() | 尝试查找与该模式匹配的输入序列的下一个子序列。 | |
public boolean find(int start) | 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 | |
public boolean matches() | 尝试将整个区域与模式匹配。 | |
替换方法 | ||
public Matcher appendReplacement(StringBuffer sb, String replacement) | 实现非终端添加和替换步骤。 | |
public StringBuffer appendTail(StringBuffer sb) | 实现终端添加和替换步骤。 | |
public String replaceAll(String replacement) | 替换模式与给定替换字符串相匹配的输入序列的每个子序列。 | |
public String replaceFirst(String replacement) | 替换模式与给定替换字符串匹配的输入序列的第一个子序列。 | |
public static String quoteReplacement(String s) | 返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。 |
start 和 end 方法
下面是一个对单词 "cat" 出现在输入字符串中出现次数进行计数的例子,很好的说明start和end返回数值的规律:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatches
{
private static final String REGEX = "\\bcat\\b";
private static final String INPUT =
"cat cat cat cattie cat";
public static void main( String[] args ){
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获取 matcher 对象
int count = 0;
while(m.find()) {
count++;
System.out.println("Match number "+count);
System.out.println("start(): "+m.start());
System.out.println("end(): "+m.end());
}
}
}
Match number 1 start(): 0 end(): 3 Match number 2 start(): 4 end(): 7 Match number 3 start(): 8 end(): 11 Match number 4 start(): 19 end(): 22(实际该字符串仅有22位)
Start 方法返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引,end 方法最后一个匹配字符的索引加 1。
appendReplacement 和 appendTail 方法
情况1:没有调用appendTail,末尾的字符串不会输出
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexMatchesReplace
{
private static String REGEX = "a*b";
private static String INPUT = "aabfo00000aabfooabfoobk00kk";
private static String REPLACE = "-";
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
// 获取 matcher 对象
Matcher m = p.matcher(INPUT);
StringBuffer sb = new StringBuffer();
while(m.find()){
m.appendReplacement(sb,REPLACE);
}
//把appendTail注释掉
// m.appendTail(sb);
System.out.println(sb.toString());
}
}
此时运行结果为-fo00000-foo-foo-。
情况2: 取消注释appendtail,则结果为-fo00000-foo-foo-k00kk,也就是如果仅使用appendREPLACEMENT,则仅有匹配成功完成的所有字符,
简单来说,就是appendReplacement方法,会将匹配到的内容替换成相关字符串,然后追加写入到StringBuffer中,下次再遇到匹配的内容的话,先追加拼接未匹配到的字符串,然后再追加替换的字符串。然后通过appendTail来追加写入末尾的未匹配到的剩余的字符串到StringBuffer对象中。