Java正则表达式笔记
正则表达式
1.概念
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
- 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
- 给定一个正则表达式和另一个字符串,我们可以达到如下的目的:
- 1.给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);
- 2.可以通过正则表达式,从字符串中获取我们想要的特定部分。(爬虫应用)
- 相关类:
java.lang.String
java.util.regex.Pattern
java.util.regex.Matcher
2.正则表达式(常见的规则)
- 两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束。例子如下:
//两个特殊的符号'^'和'$'。他们的作用是分别指出一个字符串的开始和结束
"^The":表示所有以"The"开始的字符串("There","The cat"等);
"of despair$":表示所以以"of despair"结尾的字符串;
"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;
"notice":表示任何包含"notice"的字符串。
// * ? +来表示次数
"ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
"ab?":表示一个字符串有一个a后面跟着零个或者一个b;
"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。
// {}指定范围
"ab{2}":表示一个字符串有一个a跟着2个b("abb");
"ab{2,}":表示一个字符串有一个a跟着至少2个b;
"ab{3,5}":表示一个字符串有一个a跟着3到5个b。
// . 可以代替任何字符
"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.{3}$":表示有任意三个字符的字符串(长度为3个字符);
方括号表示某些字符允许在一个字符串中的某一特定位置出现:
"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");
"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");
"^[a-zA-Z]":表示一个以字母开头的字符串;
"[0-9]%":表示一个百分号前有一位的数字;
",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。
可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。
(如:"%[^a-zA-Z]%"表示两个百分号中不应该出现字母)。为了逐字表达,你必须在"^.$()|*+?{\"这些字符前加上转移字符'\'。
字符类
[abc] ---- a、b 或 c(简单类) (某一位上只能是a,b,c)
[^abc] ---- 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] ---- a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] ---- a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] ---- d、e 或 f(交集)
[a-z&&[^bc]] ---- a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] ---- a 到 z,而非 m 到 p:[a-lq-z](减去)
预定义字符类
. ---- 任何字符(与行结束符可能匹配也可能不匹配)
\d ---- 数字:[0-9]
\D ---- 非数字: [^0-9]
\s ---- 空白字符:[ \t\n\x0B\f\r]
\S ---- 非空白字符:[^\s]
\w ---- 单词字符:[a-zA-Z_0-9]
\W ---- 非单词字符:[^\w]
边界匹配器
^ ---- 行的开头
$ ---- 行的结尾
\b ---- 单词边界
\B ---- 非单词边界
\A ---- 输入的开头
\G ---- 上一个匹配的结尾
\Z ---- 输入的结尾,仅用于最后的结束符(如果有的话)
\z ---- 输入的结尾
Greedy 数量词
X? ---- X,一次或一次也没有 (举例演示)
X* ---- X,零次或多次
X+ ---- X,一次或多次
X{n} ---- X,恰好 n 次
X{n,} ---- X,至少 n 次
X{n,m} ---- X,至少 n 次,但是不超过 m 次
3.常用操作
//1、匹配其实使用的就是String类中的matches()方法
"15115282455".matches("1[3-9]\\d{9}")
//2、切割其实使用的就是String类中的split()方法
System.out.println(Arrays.toString("lzp.is.666".split("\\.")));
System.out.println(Arrays.toString("lzp is 666".split(" +")));
System.out.println(Arrays.toString("zhangsantttxiaowangqqqlaowangzzz".split("(.)\\1+"))); //[zhangsan, xiaowang, laowang] 重复字符出现多个时分为一组看次数来分割
//3、替换其实使用的就是String类中的replaceAll()方法
System.out.println("zhangsantttxiaowangqqqlaowangzzz".replaceAll("(.)\\1+","$1")); //zhangsantxiaowangqlaowangz 将字符串中重复的多个字符用一个字符替换
4.案例
4.1匹配手机号
String regex = "1[3-9][0-9]{9}";
String regex = "1[3-9]\\d{9}";
System.out.println("15115282455".matches(regex));
4.2匹配三个字母组成的单词
public static void main(String[] args) throws IOException {
//获取三个字母组成的单词
String str = "da jia hao,ming tian bu fang jia";
//String regex = "[a-z]{3}";
String regex = "\\b[a-z]{3}\\b";// 单词边界 \\b
//1、将正则规则进行对象的封装
Pattern p = Pattern.compile(regex);
//2、通过正则对象获取匹配器对象
Matcher m = p.matcher(str);
//3、使用Matcher对象的方法对字符串进行操作。
// 既然要获取三个字母组成的单词
// 查找find();
// m.find();
// System.err.println(m.group());//获取匹配的子序列
System.out.println(str);
while(m.find()){
System.out.println(m.group());//获取匹配的子序列
System.out.println(m.start()+" : "+m.end());
}
}
4.3匹配必须包含字母、数字
username.matches("[^a-z]+|[^A-Z]+|[^0-9]+") //如果不包含大写、小写、数字中的任何一个则为true
4.4匹配身份证(自制)
idCard.matches("\\d{6}\\d{4}(([0][1-9])|([1][0-2]))(([0][1-9])|([1][0-9])|([2][0-9])|([3][0-1]))[0-9]{3}[xX0-9]") //没考虑闰年和年份

浙公网安备 33010602011771号