大家好,欢迎来到IT知识分享网。
在这一节中来看看 Matcher 类中其他一些有用的方法。方便起见,下面列出的方法是按照功能来分组的。
索引方法
索引方法(index methods)提供了一些正好在输入字符串中发现匹配的索引值:
public int start():返回之前匹配的开始索引。
public int start(int group):返回之前匹配操作中通过给定组所捕获序列的开始索引。
public int end(): 返回最后匹配字符后的偏移量。
public int end(int group): 返回之前匹配操作中通过给定组所捕获序列的最后字符之后的偏移量。
研究方法
研究方法(study methods)回顾输入的字符串,并且返回一个用于指示是否找到模式的布尔值。
public boolean lookingAt(): 尝试从区域开头处开始,输入序列与该模式匹配。
public boolean find(): 尝试地寻找输入序列中,匹配模式的下一个子序列。
public boolean find(int start): 重置匹配器,然后从指定的索引处开始,尝试地寻找输入序列中,匹配模式的下一个子序列。
public boolean matches(): 尝试将整个区域与模式进行匹配
替换方法
替换方法(replacement methods)用于在输入的字符串中替换文本有用处的方法。
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 方法中的字面值替换 s。所产生的字符串将与作为字面值序列的 s 中的字符序列匹配。斜线(\)和美元符号($)将不再有特殊意义了。
9.1 使用 start 和 end 方法
示例程序 MatcherDemo.java 用于计算输入序列中单词“dog”的出现次数。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatcherDemo {
private static final String REGEX = “\\bdog\\b”;
private static final String INPUT = “dog dog dog doggie dogg”;
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获得匹配器对象
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
可以看出,这个例子使用了单词边界,用于确保更长单词中的字母“d”“o”“g”就不是子串了。它也输出了一些有用的信息,在输入的字符串中什么地方
有匹配。start 方法返回在以前的匹配操作期间,由给定组所捕获子序列的开始处索引,end 方法返回匹配到最后一个字符索引加 1。
9.2 使用 matches 和 lookingAt 方法
matches 和 lookingAt 方法都是尝试该模式匹配输入序列。然而不同的是,matches 要求匹配整个输入字符串,而 lookingAt 不是这样。这两个方法都是从输入字符串的开头开始的。下面是 MatchesLooking.java 完整的代码:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class MatchesLooking {
private static final String REGEX = “foo”;
private static final String INPUT = “fooooooooooooooooo”;
private static Pattern pattern;
private static Matcher matcher;
public static void main(String[] args) {
// 初始化
pattern = Pattern.compile(REGEX);
matcher = pattern.matcher(INPUT);
System.out.println(“Current REGEX is: ” + REGEX);
System.out.println(“Current INPUT is: ” + INPUT);
System.out.println(“lookingAt(): ” + matcher.lookingAt());
System.out.println(“matches(): ” + matcher.matches());
}
}
输出:
Current REGEX is: foo
Current INPUT is: fooooooooooooooooo
lookingAt(): true
matches(): false
9.3 使用 replaceFirst(String) 和 replaceAll(String) 方法
replaceFirst 和 replaceAll 方法替换匹配给定正则表达式的文本。从它们的名字可以看出,replaceFirst 替换第一个匹配到的,而 replaceAll 替换所有匹配的。下面是 ReplaceDemo.java 的代码:
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo {
private static String REGEX = “dog”;
private static String INPUT = “The dog says meow. All dogs say meow.”;
private static String REPLACE = “cat”;
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获得匹配器对象
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
输出:
The cat says meow. All cats say meow.
在上面的例子中,所有的 dog 都被替换成了 cat。但是为什么在这里停下来了呢?你可以替换匹配任何正则表达式的文本,这样优于替换一个简单的像 dog 一样的文字。这个方法的 API 描述了“给定正则表达式a*b,在输入‘aabfooaabfooabfoob’和替换的字符串是‘-’情况下,表达式的匹配器调用方法后,会产生成字符串‘-foo-foo-foo-’。”
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ReplaceDemo2 {
private static String REGEX = “a*b”;
private static String INPUT = “aabfooaabfooabfoob”;
private static String REPLACE = “-“;
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获得匹配器对象
INPUT = m.replaceAll(REPLACE);
System.out.println(INPUT);
}
}
输出:
-foo-foo-foo-
仅要替换模式一次时,可以简单地调用 replaceFirst 用于取代 replaceAll,它接受相同的参数。
9.4 使用 appendReplacement(StringBuffer, String) 和 appendTail(StringBuffer) 方法
Matcher 类也提供了 appendReplacement 和 appendTail 两个方法用于文本替换。下面的这个例子(RegexDemo.java)使用了这两个方法完成与 replaceAll 相同的功能。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class RegexDemo {
private static String REGEX = “a*b”;
private static String INPUT = “aabfooaabfooabfoob”;
private static String REPLACE = “-“;
public static void main(String[] args) {
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // 获得匹配器对象
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, REPLACE);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
输出:
-foo-foo-foo-
9.5 在 java.lang.String 中等价的 Matcher 方法
为了使用方便,String 类看上去还不错地模仿了 Matcher 的两个方法:
public String replaceFirst(String regex, String replacement):
使用给定的替换字符串替换该字符串中匹配了给定正则表达式的第一个子字符串。调用 str.replaceFirst(regex,
repl)方法与使用
Pattern.compile(regex).matcher(str).replaceFirst(repl)产生的结果是完全相同的。
public String replaceAll(String regex, String replacement):
使用给定的替换字符串替换该字符串中匹配了给定正则表达式的每一个子字符串。调用 str.replaceAll(regex, repl)方法与使用
Pattern.compile(regex).matcher(str).replaceAll(repl)产生的结果是完全相同的。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/23814.html