欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java之Pattern和Matcher的作用

程序员文章站 2024-01-20 19:45:16
...

java.util.regex.Pattern类的实例的主要作用是给正则表达式一个匹配模式,因为在java里面正则表达式是一个字符串,字符串的能力是非常有限的,不像javascript那样可以在正则表达式末尾添加"g" "i" "m"来指定全局匹配、区分大小写匹配和多行匹配(如"/\b\w/gi")。因此在java里面需要Pattern实例来包装正则表达式zifu字符串,然后通过Pattern实例的方法来设置·匹配模式。

java.util.regex.Matcher类的实例的作用是增加表达式匹配字符串的权利,让正则表达式更*的匹配字符串。比如调用Matcher实例的方法,正则表达式可以匹配整个字符串、可以匹配字符串最前端的子串、最后段的子串、或者任意位置的子串等等。 

Pattern的用法

  • Pattern complie(String regex)

       由于Pattern的构造函数是私有的,不可以直接创建,所以通过静态方法compile(String regex)方法来创建,将给定的正则表达式编译并赋予给Pattern类。

  • String pattern()

        返回正则表达式的字符串形式,其实就是返回Pattern.complile(String regex)的regex参数

String regex = "\\?{2}";
Pattern pattern = Pattern.compile(regex);
String str = pattern.pattern();
System.out.println(str);// \?{2}
  • Pattern compile(String regex, int flags)

       方法功能和compile(String regex)相同,不过增加了flag参数

  • int flags()

       返回当前Pattern的匹配flags参数。flag参数用来控制正则表达式的匹配行为,可取值范围如下:

Pattern.CANON_EQ 当且仅当两个字符的”正规分解(canonical decomposition)”都完全相同的情况下,才认定匹配.比如用了这个标志之后,表达式”a\u030A”会匹配”?”.默认情况下,不考虑”规范相等性(canonical equivalence)”.

Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不明感的匹配只适用于US-ASCII字符集.这个标志能让表达式忽略大小写进行匹配.要想对Unicode字符进行大小不明感的匹 配,只要将UNICODE_CASE与这个标志合起来就行了.

Pattern.COMMENTS(?x) 在这种模式下,匹配时会忽略(正则表达式里的)空格字符(译者注:不是指表达式里的”\s”,而是指表达式里的空格,tab,回车之类).注释从#开始,一直到这行结束.可以通过嵌入式的标志来启用Unix行模式.

Pattern.DOTALL(?s)在这种模式下,表达式’.’可以匹配任意字符,包括表示一行的结束符。默认情况下,表达式’.’不匹配行的结束符.

Pattern.MULTILINE(?m)在这种模式下,’\^’和’$’分别匹配一行的开始和结束.此外,’^’仍然匹配字符串的开始,’$’也匹配字符串的结束.默认情况下,这两个表达式仅仅匹配字符串的开始和结束.

Pattern.UNICODE_CASE(?u) 在这个模式下,如果你还启用了CASE_INSENSITIVE标志,那么它会对Unicode字符进行大小写不明感的匹配.默认情况下,大小写不敏感的匹配只适用于US-ASCII字符集.

Pattern.UNIX_LINES(?d) 在这个模式下,只有’\n’才被认作一行的中止,并且与’.’,’^’,以及’$’进行匹配.

Pattern pattern = Pattern.compile("\\?{2}",Pattern.CASE_INSENSITIVE);
int i = pattern.flags();
//Pattern源码对CASE_INSENSITIVE常量定义为:
//public static final int CASE_INSENSITIVE = 0x02;
System.out.println(i);// 2
  • Pattern.matcher(CharSequence input)

       对指定输入的字符串创建一个Matcher对象。Matcher对象一般通过这个方法生成。CharSequence是个interface,String类实现了CharSequence接口,因此可以传入String类型的值。

Pattern pattern = Pattern.compile("\\?{2}");
Matcher matcher = pattern.matcher("??");
//matcher的matches方法是对字符串整合匹配。只有整个字符串符合正则表达式才会返回true
boolean matches = matcher.matches();// true
  • String[] split(CharSequence input)
    根据正则表达式分割传入的这个字符串。

  • String[] split(CharSequence input, int limit)
    功能和String[] split(CharSequence input)相同,增加参数limit目的在于要指定分割的段数

Pattern pattern = Pattern.compile("[#_-]");
String str = "lao#lian_shi_shui-?";
String[] arrays = pattern.split(str, 3);
for (String s : arrays) {
	System.out.println(s);
}

/*控制台输出为:
lao
lian
shi_shui-?

也就是arrays数组存放着3个元素。从这里可以看出,Pattern的split方法类似于String的split方法。
*/

还有其他的方法请参考其他的文章。

Matcher类的使用

  • boolean matches()

最常用方法:尝试对整个目标字符展开匹配检测,也就是只有整个目标字符串完全匹配时才返回真值.

Pattern pattern = Pattern.compile("\\?{2}");
Matcher matcher = pattern.matcher("??");
boolean matches = matcher.matches();//true
System.out.println(matches);
matcher=pattern.matcher("?");
matches = matcher.matches();//false
System.out.println(matches);
  • boolean lookingAt()

对前面的字符串进行匹配,只有匹配到的字符串在最前面才会返回true

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
boolean match = m.lookingAt();//true
System.out.println(match);
m = p.matcher("bb2233");
match= m.lookingAt();
System.out.println(match);//false
  • boolean find()

对字符串进行匹配,匹配到的字符串可以在任何位置

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("22bb23");
m.find();// 返回true
Matcher m2 = p.matcher("aa2223");
m2.find();// 返回true
Matcher m3 = p.matcher("aa2223bb");
m3.find();// 返回true
Matcher m4 = p.matcher("aabb");
m4.find();// 返回false
  • int start()

返回当前匹配到的字符串在原目标字符串中的位置

  • int end()

返回当前匹配的字符串的最后一个字符在原目标字符串中的索引位置.

  • String group()

返回匹配到的子字符串

Pattern p = Pattern.compile("\\d+");
Matcher m = p.matcher("aa22bb23");
m.find();
int start = m.start();//2
String group = m.group();//22
int end = m.end();//4
System.out.println(start);
System.out.println(group);
System.out.println(end);

还有其他方法请参考其他文章。

Pattern和Matcher使用完整例子

    public static void main(String[] args) {
		String str = "abcdefg";
		String regex = "ABC*";
		// 匹配时忽略大小写
		Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
		// 包装被匹配的字符串
		Matcher matcher = pattern.matcher(str);
		// 看看被匹配的字符串是否有正则表达式描述的子串
		boolean bool = matcher.find();
		System.out.println(bool);// true
	}

部分内容参考自博客:https://blog.csdn.net/yin380697242/article/details/52049999

相关标签: Matcher Pattern