java的正则表达式
1. 字符类
(1). []
含义:里面的内容出现一次
举例:[0-9] [a-zA-Z0-9]
作用:匹配单个字符是否是数字,匹配单个字符是否是数字或者大小写字母
(2). ()
含义:分组,将相应部分抽离出主体,做单独处理
举例:a(bc)+
作用:匹配a开头,bc结尾的字符串,其中bc可能会出现多次,例如abc,abcbc,abcbcbcbcbcbc
(3). ^
含义:非,取反
举例:[^0-9] [^abc]
作用:匹配非数字,效果等同于\D,非a、b、c字符之外的其他字符
(4). &&
含义:交集
举例:[a-e&&[d-f]]
作用:匹配d或者e,即a-e和d-f二者之间的交集
(5). |
含义:并集、或(写在中括号外面)
举例:x|X
作用:在中括号外面表示或者,取并集。匹配小写的x或者大写的X
(6). 其他特殊字符含义
. 任意字符(\n回车符号不匹配)
\ 转义字符(对一些具有特殊的字符做转义)
\d 匹配数字(即[0-9])
\D 匹配非数字(即[^0-9])
\s 空白字符(即[\t\n\xOB\f\r])
\S 非空白字符([^\s])
\w 单词字符(即[a-zA-Z0-9_])
\W 非单词字符(即[^\w])
2. 出现数量类
(1). ?
含义:出现0或者1次
举例[0-9]?
作用:匹配空字符串或者0-9的数字
(2). *
含义:出现0或者多次
举例[0-9]*
作用:匹配空字符串或者数字
(3). +
含义:出现1或者多次
举例[0-9]+
作用:匹配数字,数字长度至少一位
(4). {n}
含义:出现n次,位数必须恰好等于n
举例[0-9]{5}
作用:匹配5位的数字,数字长度必须为5位
(5). {n, }
含义:至少出现n次,位数必须大于等于n
举例[0-9]{5}
作用:匹配大于5位的数字,数字长度必须为大于5位
(5). {n, m}
含义:至少出现n次,但是少于m次,位数必须大于等于n,小于等于m
举例[0-9]{5, 9}
作用:匹配大于5位的数字,数字长度必须为大于等于5位,但是小于等于9位
(6). (?i)
含义:忽略符号后面的大小写进行匹配
举例:(?i)abc , a(?i)bc
作用:匹配abc,其中三个字母的大小写全都忽略。匹配a开头的bc结尾的,其中bc的大小写全都可以忽略。
3. 零宽断言
(1). ?=
含义:正向先行断言
举例:pattern1(?=pattern2)
作用:代表字符串中的一个位置能够匹配pattern1,紧接该位置之后的字符序列能够匹配pattern2,匹配返回的结果只打印pattern1
(2). ?!
含义:负向先行断言
举例:pattern1(?!pattern2)
作用:代表字符串中的一个位置能够匹配pattern1,紧接该位置之后的字符序列绝对不能够匹配pattern2,匹配返回的结果只打印pattern1
(3). ?<=
含义:正向后行断言
举例:(?<=pattern2)pattern1
作用:代表字符串中的一个位置能够匹配pattern1,紧接该位置之前的字符序列能够匹配pattern2,匹配返回的结果只打印pattern1
(3). ?<!
含义:负向后行断言
举例:(?<!pattern2)pattern1
作用:代表字符串中的一个位置能够匹配pattern1,紧接该位置之前的字符序列绝对不能够匹配pattern2,匹配返回的结果只打印pattern1
4. 贪婪匹配与非贪婪匹配
1. 贪婪匹配
含义:匹配字符越多越好,默认
举例: (ab)+,(ab)*
作用:尽可能多的匹配ab字符串出现的
2. 非贪婪匹配
含义: 匹配字符越少越好
举例: (ab)+?, (ab)*?
5. 捕获分组与非捕获分组
1. 捕获分组
含义:可以获取到分组内容并进行使用
举例:(ab)\w*\1
作用:匹配以ab开头,ab结尾的字符串
特点:分组以\加上数字表示复用的第几组分组数据,分组从1开始,不间断,以左括号为基准,最左边的是第一组
其他:在正则表达式内部用\n表示,在外部以$n表示第n个分组。
2. 非捕获分组
含义:分组之后该组数据不需要使用,仅仅把数据括起来,不占组号。
举例:(?:) (?=) (?!) (?<=) (?<!)
常用的java正则表达式汇总
1. 手机号匹配
部分测试代码
@Test
public void test3() {
// testRegex("abcb", "a(bc)+");
// testRegex("ef", "[a-e&&[d-f]]*");
// testRegex("9", "[0-9]*");
// testRegex("", "[0-9]*");
// testRegex("", "[0-9]+");
// testRegex("5676575", "[0-9]*");
// testRegex("5676575", "[0-9]+");
// testRegex("5", "[0-9]+");
// testRegex("50000000", "[0-9]{5,9}");
// testRegex("b", "[(?i)aBc]");
String regex = "(?<!(\\d))java";
String text = "123 java8 java9javaq";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
while (matcher.find()) {
System.out.println(matcher.group());
}
// testRegex("java8", "java(?=\\d)");
}
public void testRegex(String str, String regex) {
System.out.println(str.matches(regex));
}