转自:
http://www.java265.com/JavaCourse/202206/3831.html
下文笔者讲述Java代码中的Pattern和Matcher类的简介说明
Pattern用法
Pattern类:
用于创建一个正则表达式
创建一个匹配模式
可以通过两个静态方法创建
compile(String regex)和compile(String regex,int flags)
参数说明:
regex是正则表达式
flags为可选模式(如:Pattern.CASE_INSENSITIVE忽略大小写)
例:
Pattern pattern = Pattern.compile(\"Java\");
//返回此模式的正则表达式即Java
System.out.println(pattern.pattern());
Pattern类还有两个根据匹配模式拆分输入序列的方法
split(CharSequence input)
split(CharSequence input, int limit)
其中limit为返回元素的个数
例:
Pattern pattern = Pattern.compile(\"Java\");
String test=\"123Java456Java789Java\";
String[] result = pattern.split(test);
for(String s : result)
System.out.println(s);
运行以上代码,将输出以下信息
123
456
789
例:
Pattern pattern = Pattern.compile(\"Java\"); String test = \"123Java456Java789Java\"; String[] result = pattern.split(test,2); for(String s : result) System.out.println(s); result = pattern.split(test,10); System.out.println(result.length); result = pattern.split(test,-2); System.out.println(result.length); result = pattern.split(test,0); System.out.println(result.length); 运行以上代码,将输出以下信息 123 456Java789Java 4 4 3
Matcher类用法
Matcher类提供了对正则表达式的分组支持 以及对正则表达式的多次匹配支持 要想得到更丰富的正则匹配操作 那就需要将Pattern与Matcher联合使用
例:
Pattern pattern = Pattern.compile(\"Java\"); String test = \"123Java456Java789Java\"; Matcher matcher = pattern.matcher(); Matcher类提供了三个返回boolean值得匹配方法 matches() lookingAt() find() find(int start) 其中matches()用于全字符串匹配 lookingAt从字符串最开头开始匹配满足的子串 find可以对任意位置字符串匹配 其中start为起始查找索引值
例
Pattern pattern = Pattern.compile(\"Java\"); String test1 = \"Java\"; String test2 = \"Java1234\"; String test3 = \"1234Java\" // match方法需要整个字符串都匹配正则才返回true // 返回true Matcher matcher = pattern.matcher(test1); System.out.println(matcher.matches()); // 返回false matcher = pattern.matcher(test2); System.out.println(matcher.matches()); // lookingAt需要字符串是以正则模式开头,才返回true // 返回true matcher = pattern.matcher(test2); System.out.println(matcher.lookingAt()); // 返回false matcher = pattern.matcher(test3); System.out.println(matcher.lookingAt()); //从相应的下标开始匹配,只要有匹配到的就返回true //返回true matcher = pattern.matcher(test1); System.out.println(matcher.find()); //返回true matcher = pattern.matcher(test2); System.out.println(matcher.find()); matcher = pattern.matcher(test3); //返回true System.out.println(matcher.find(2)); matcher = pattern.matcher(test3); //返回false System.out.println(matcher.find(5));
Matcher类提供了start()
end()
group()
分别用于返回字符串的起始索引,结束索引,及匹配到到的字符串
例
Pattern pattern = Pattern.compile(\"(java)\");
Matcher matcher = pattern.matcher(\"12java自由java之路\");
int groupCount = matcher.groupCount();
System.out.println(groupCount);
groupCount = matcher.groupCount();
System.out.println(groupCount);
while (matcher.find()) {
int start = matcher.start();
int end = matcher.end();
String group = matcher.group();
System.out.println(\"start:end:group-->\" + start + \":\" + end + \":\" + group);
}
Matcher类提供了start(int gropu),end(int group),group(int i),groupCount()用于分组操作
例
Pattern pattern1 = Pattern.compile(\"(?<p1>java)(python)\");
Matcher matcher1 = pattern1.matcher(\"java自由java之路javapython自由之路python\");
// 输出false,因为要满足整个字符串匹配正则才输出true
System.out.println(matcher1.matches());
// 输出false,因为要满足字符串以正则模式开头才输出true
System.out.println(matcher1.lookingAt());
// 输出分组数量:2
// 加上默认分组其实有三个分组:javapython、java、python
int count = matcher1.groupCount();
System.out.println(\"分组数量:\" + count);
while (matcher1.find()) {
System.out.println(\"find str...\");
for (int i = 0; i <= count; i++) {
int start = matcher1.start(i);
int end = matcher1.end(i);
String group = matcher1.group(i);
System.out.println(\"start:end:group-->\" + start + \":\" + end + \":\" + group);
}
// 通过分组名称来获取分组的值
System.out.println(\"xxx-->\"+matcher1.group(\"p1\"));
}
Matcher类还提供region(int start, int end)(不包括end)方法用于设定查找范围,并提供regionStrat()和regionEnd()用于返回起始和结束查找的索引。
此方法和find方法类似,但是比find方法更强大
find方法只能制定开始下标。但是region可以指定一个范围。
Pattern pattern = Pattern.compile(\"Java\"); String test = \"123JavaJava\"; Matcher matcher = pattern.matcher(test); matcher.region(7, 11); // 返回7 System.out.println(matcher.regionStart()); // 返回11 System.out.println(matcher.regionEnd()); matcher.find(); //返回 Java System.out.println(matcher.group()); Matcher类提供了两种用于重置当前匹配器的方法:reset()和reset(CharSequence input) Pattern pattern = Pattern.compile(\"Java\"); String test = \"Java\"; Matcher matcher = pattern.matcher(test); matcher.find(); //返回Java System.out.println(matcher.group()); //从起始位置重新匹配 matcher.reset(); matcher.find(); //返回Java System.out.println(matcher.group()); //返回false //相当于matcher = pattern.matcher(\"Python\"); matcher.reset(\"Python\"); System.out.println(matcher.find()); 最后说一下Matcher类的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替换全部匹配到的字符串,而replaceFirst仅仅是替换第一个匹配到的字符串。 Pattern pattern = Pattern.compile(\"Java\"); String test = \"JavaJava\"; Matcher matcher = pattern.matcher(test); //返回PythonPython System.out.println(matcher.replaceAll(\"Python\")); //返回PythonJava System.out.println(matcher.replaceFirst(\"python\")); 还有两个方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement允许直接将匹配的字符串保存在另一个StringBuffer中并且是渐进式匹配,并不是只匹配依次或匹配全部,而appendTail则是将未匹配到的余下的字符串添加到StringBuffer中。 Pattern pattern = Pattern.compile(\"Java\"); Matcher matcher = pattern.matcher(\"Java1234\"); //返回true System.out.println(matcher.find()); StringBuffer sb = new StringBuffer(); matcher.appendReplacement(sb, \"Python\"); //输出Python System.out.println(sb); matcher.appendTail(sb); //输出Python1234 System.out.println(sb);
来源:https://www.cnblogs.com/java265/p/16438916.html
本站部分图文来源于网络,如有侵权请联系删除。
百木园