java如何支持正则表达式
java的String类提供了支持正则表达式的方法,并且java中Pattern提供了丰富的API支持各种正则表达式操作。
1、java 正则表达式元字符
元字符是在java正则表达式中具有特殊含义的字符。
Java中正则表达式的元字符如下:
( ) [ ] { } \ ^ $ | ? * + . < > - = !
其中,[ ] 表示正则表达式中的字符类。
字符类 | 含义 |
---|---|
[abc] | 字符a、b、c |
[^abc] | 除了字符x、y、z以外的其他字符 |
[a-z] | 字符a和z之间的所有字符 |
a-cx-z | 字符a到c或x到z,其中包括字符a、b、c、x、y、z |
0-9&&[4-8] | 字符0到9和字符4到8的交集,即字符4、5、6、7、8 |
[a-z&&[^aeiou]] | 字符a到z中除了a、e、i、o、u以外的字符 |
除此之外,Java中还定义了一些预定义字符
预定义字符 | 含义 |
---|---|
. | 任何字符 |
\d | 数字字符 |
\D | 非数字字符 |
\s | 空格字符。 包括与[\ t \ n \ x0B \ f \ r]相同,即空格、标签、换行符、垂直标签、表单Feed、回车字符 |
\S | 非空格字符 |
\w | 一个字符,与[a-zA-Z0-9]相同 |
\W | 非字字符,与[^\w]相同 |
表示次数的符号
符号 | 次数 |
---|---|
* | 0次或者多次 |
+ | 1次或者多次 |
? | 0次或者1次 |
{n} | 恰好n次 |
{n,m} | 从n次到m次 |
2、java 正则表达式模式
java.util.regex提供了三个类,支持正则表达式:
- Pattern 表示正则表达式对象。一个Pattern表示一个正则表达式编译后的表现模式。
- Matcher 一个Mactcher实例是一个状态机器。依据Pattern对象作为匹配模式进行字符串匹配。
- PatternSyntaxException 一个非强制异常类,表示一个正则表达式中的语法错误。
正则表达式字符匹配流程:
首先,一个Pattern实例订制一个所用语法的正则表达式经过编译以后的表现模式。然后,一个Matcher实例利用Pattern实例的表现模式进行字符串匹配工作。
(1)Pattern类常用方法
//将一个正则表达式编译并赋值给Pattern
public static Pattern compile(String regex) {
return new Pattern(regex, 0);
}
/**
*{@link #CASE_INSENSITIVE}, {@link #MULTILINE}, {@link #DOTALL},
* {@link #UNICODE_CASE}, {@link #CANON_EQ}, {@link #UNIX_LINES},
* {@link #LITERAL}, {@link #UNICODE_CHARACTER_CLASS}
* and {@link #COMMENTS}
*/
//将一个正则表达式编译并赋值给Pattern,并且增加指定flags,flags参数有以下几种。
public static Pattern compile(String regex, int flags) {
return new Pattern(regex, flags);
}
//得到flags值
public int flags() {
return flags;
}
//生成一个指定名字的Matcher对象
public Matcher matcher(CharSequence input) {
if (!compiled) {
synchronized(this) {
if (!compiled)
compile();
}
}
Matcher m = new Matcher(this, input);
return m;
}
//根据给定的正则表达式(pattern)编译后的表现模式对输入的字符串(input)进行匹配工作。
//需要注意这个方法只适用于匹配一次,不需要得到Matcher对象的情况
public static boolean matches(String regex, CharSequence input) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();
}
//返回该对象所表达的正则表达式
public String pattern() {
return pattern;
}
//将目标字符串(input)按照给定的正则表达式(pattern)规则进行分割
public String[] split(CharSequence input) {
return split(input, 0);
}
//作用同上,但是要求字符串分割为指定个数(limit)
public String[] split(CharSequence input, int limit) {
int index = 0;
boolean matchLimited = limit > 0;
ArrayList<String> matchList = new ArrayList<>();
Matcher m = matcher(input);
// Add segments before each match found
while(m.find()) {