版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons)
1.学习背景
在计算机诞生之初,主要用于相关科研计算,但是随着其逐步地平民化,在编程领域可以看到越来越多的字符串的利用,而正则表达式作为一种语法,其方便之处就在于可以利用简短的规则,将目标字符串操作实现,并且其目前已经被大多数编译器所支持。
2.Java中Pattern类、Matcher类介绍
- Pattern类与Matcher类一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。
- java正则表达式通过java.util.regex包下的Pattern类与Matcher类实现。
- Pattern类用于创建一个正则表达式,也可以说创建一个匹配模式,它的构造方法是私有的,不可以直接创建,但可以通过Pattern.complie(String regex)简单工厂方法创建一个正则表达式。
- 注意事项:查看JDK-API文档,可以看到complie方法调用的Pattern(String p, int f)是被private修饰的。而Pattern类中的pattern()是返回当前正则表达式(字符串),只有前者(大写的Pattern)才是Pattern类的构造器。
3.Java中Pattern类的重要方法介绍(涉及方法的重载)
3.1主要方法简介
方法名 | 入口参数 | 返回值 | 修饰 |
---|---|---|---|
pattern() | 无 | 正则表达式的字符串形式 | public String |
Pattern() | String p, int f | 此为Pattern类的构造器 | private |
compile() | String regex | new Pattern(regex, 0)创建的对象 | public static Pattern |
compile() | String regex, int flags | new Pattern(regex, flag)创建的对象 | public static Pattern |
toString() | 无 | pattern,即正则表达式的字符串形式,和pattern()方法相同 | public String |
matcher | CharSequence input | Matcher对象 | public Matcher |
flags() | 无 | flags值 | public int |
matches() | String regex, CharSequence input | boolean值 | public static boolean |
split() | CharSequence input, int limit | 字符串数组(对象) | public String[] |
split() | CharSequence input | 字符串数组(对象)即split(input, 0) | public String[] |
quote() | String s | 字符串 | public static String |
其中CharSequence input 一般就是需要相关操作的字符串
3.2主要方法的详细
-
complie(String regex)
:此方法主要通过静态方法调用,输入一个正则表达式,返回一个Patter对象,我们将此对象称作正则表达式的对象,注意:输入的字符串所含的正则表达式原本一杠在Java语法中都要转化为两杠才合法。 -
complie(String regex, int flags)
:此方法与上个方法类似,只不过利用flags来控制正则表达式匹配模式的选择,比如是否匹配大小写。详细见下个模块,Java中的匹配模式控制。 -
split(CharSequence input)
,用于分隔字符串,并返回一个String[],举例: Pattern p2 =Pattern.compile("\d "); String[] strings=p2.split("Hello123 World456!"); for(String temp:strings){ System.out.print(temp); } 最终Console上显示:Hello World! - matcher(String regex,CharSequence input)是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串。例子:
Pattern.matches("\d ","2223");//返回true
- matcher(CharSequence input) 此方法用于创建和返回一个Macher类对象,Matcher类的构造方法是仅包内可用即package-private,也就是默认的类修饰,而一般我们只是在别包中import Matcher类,所以并不能调用其构造方法。Pattern.matcher(CharSequence input)方法得到该类的实例。
3.3Java中正则表达式匹配模式的选择
Java在Pattern类中规定了9个匹配模式控制符:
public static final int UNIX_LINES = 0x01;
public static final int CASE_INSENSITIVE = 0x02;
public static final int COMMENTS = 0x04;
public static final int MULTILINE = 0x08;
public static final int LITERAL = 0x10;
public static final int DOTALL = 0x20;
public static final int UNICODE_CASE = 0x40;
public static final int CANON_EQ = 0x80;
public static final int UNICODE_CHARACTER_CLASS = 0x100;
各个字符所控制的模式选择不妨使用的时候上网搜索,不必死记硬背。
4.Java中Matcher类的方法介绍
4.1 Pattern类和Matcher类的区别和联系
Matcher类只能通过Pattern实例调用matcher(CharSequence input)方法来调用,且Pattern类只有一些简单的匹配操作,要想得到更强和便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作。Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持。 一下两个方法类似: 方法一:
代码语言:javascript复制Pattern p=Pattern.compile("\w ");
Matcher m =p.matcher("string123123");
System.out.println(m.matches());
方法二:
代码语言:javascript复制 Pattern p =Pattern.compile("");
System.out.println(p.matches("\w ","string123123"));
上面两个方法说明Pattern类和Matcher类有相似的”全匹配方法“:matches()方法,而且前者实际上调用了后者的matches()方法。方法一中程序更加明确可用,这是其优点。
4.2Matcher类中方法介绍
1.public boolean lookingAt()
:主要进行匹配字符串开头,案例如下:
Pattern p = Pattern.compile("\d ");
Matcher m = p.matcher("string123123");
System.out.println(m.lookingAt());
Pattern p2 = Pattern.compile("\w ");
Matcher m2 = p2.matcher("string123123");
System.out.println(m2.lookingAt());
结果为:false,true;
2.public boolean find()
:对字符串进行匹配,匹配到的字符串可以在任何位置,案例如下:
Pattern p = Pattern.compile("\d ");
Matcher m = p.matcher("string123123");
System.out.println(m.find());
Pattern p2 = Pattern.compile("\w ");
Matcher m2 = p2.matcher("string123123");
System.out.println(m2.find());
结果为:true,true
3.Mathcer.start()/ Matcher.end()/ Matcher.group()
,当使用matches(),lookingAt(),find()执行匹配操作后,就可以利用以上三个方法得到更详细的信。
-
start()
返回匹配到的子字符串在字符串中的索引位置(字符串最左侧为索引:0值) -
end()
返回匹配到的子字符串的最后一个字符在字符串中的索引位置(成立的末尾后一个) -
group()
返回匹配到的子字符串 案例分析: Pattern p = Pattern.compile("[a-z] "); Matcher m = p.matcher("123string123"); System.out.println(m.find()); System.out.println(m.start()); System.out.println(m.end()); System.out.println(m.group()); 控制台输出: true 3 9 string
4.start(int i),end(int i),group(int i),此三个方法为上诉三个方法的重载,主要用于分组的相关参数显示(小括号()为一个分组),不输入则默认第一组,举例:
代码语言:javascript复制 Pattern p = Pattern.compile("([a-z] ) (\d )");
Matcher m = p.matcher("123string123");
System.out.println(m.find());
System.out.println(m.start());
System.out.println(m.start(1));
System.out.println(m.start(2));
System.out.println(m.end());
System.out.println(m.end(1));
System.out.println(m.end(2));
System.out.println(m.group());
System.out.println(m.group(1));
System.out.println(m.group(2));
控制台输出:
true
3
3
9
12
9
12
string123
5.注意事项
- 每次执行匹配操作后start(),end(),group()三个方法的值都会改变,改变成匹配到的子字符串的信息,以及它们的重载方法,也会改变成相应的信息.
- 只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.