转载请注明出处
本文出自Hansion的博客
一、正则表达式
(Regular Expression,代码中常简写为regex、regexp或RE)
又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
二、常用元字符
. | 匹配除换行符 \n 之外的任何单字符 |
\w | 匹配任意字母、数字或下划线 |
\s | 匹配任意的空白符,包括空格、制表符、换页符等等,等价于 [ \f\n\r\t\v] |
\S | 匹配任何非空白字符。等价于 [^ \f\n\r\t\v] |
\d | 匹配数字字符,等价于[0-9] |
\D | 匹配非数字字符,等价于[^0-9] |
^ | 放在正则的最开始位置,就代表起始的意思,放在中括号里,表示排除的意思 |
$ | 匹配字符串的结束 |
三、括号、中括号、大括号
() | 分组,表达式中用了几个括号,就分几个组。匹配后可通过Matcher.group(int group)获取相应的匹配字符串 group(0)就是指的整个串,group(1)指的是第一个括号里的东西,group(2)指的第二个括号里的东西 |
[] | 定义匹配的字符范围,可以理解为,只要满足括号里面其中的某种条件即可,如[\s*]表示空格或者*号 |
{} | 一般用来表示匹配的长度,如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格 |
四、常用限定符
{n} | 匹配确定的 n 次, n 是一个非负整数 |
{n,} | 至少匹配n 次,n 是一个非负整数 |
{n,m} | 最少匹配 n 次且最多匹配 m 次,m 和 n 均为非负整数,其中n <= m |
* | 匹配前面的子表达式零次或多次,等价于{0,} |
+ | 匹配前面的子表达式一次或多次,等价于 {1,} |
? | 匹配前面的子表达式零次或一次,等价于 {0,1} |
五、在Java中使用正则表达式
1.常规写法:
Pattern pattern = Pattern.compile("正则表达式语句");
Matcher isNum = pattern.matcher("需要匹配的字符串");
可以利用获得的Matcher对象对匹配后的字符串进行按需处理
2.仅获取匹配的结果的写法:
String类中将上述写法封装成一个String.matches(String regex)方法:
"需要匹配的字符串".matches("正则表达式语句");
返回值为boolean类型,代表是否匹配
3.Pattern类常用方法
static Pattern compile(String regex) 将给定的正则表达式编译并赋予给Pattern类
Matcher matcher(CharSequence input) 生成Matcher对象
4.Matcher类常用方法
boolean matches() 是否匹配
String replaceAll(String replacement) 将目标字符串里与表达式相匹配的子串全部替换为指定的字符串
String group(int group) 返回当前查找而获得的与指定的组匹配的子串内容
六、小练习
1.是否是月份:0-9、01-09、10-12
/**
* 是否是月份,0-9、01-09、10-12
* @param month 待匹配字符串
* @return 是否匹配
*/
public boolean isMonth(String month) {
return month.matches("0?[1-9]|1[0-2]");
}
表达式解读:
0?[1-9]|1[0-2]
十位是0可能出现一次或零次,个位1-9其中的一个数,即01-09或1-9;
或者十位是1,个位是0-2其中的一个数,即10-12
2.获取字符串中的数字
/**
* 获取字符串中的数字。如03a02,获得0302
* @param str 待匹配字符串
* @return 字符串中的数字
*/
public int onlyGetNum(String str) {
String regEx="\\D";
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(str);
String num = m.replaceAll("").trim();
return Integer.parseInt(num);
}
表达式解读:
\D 等价于 [^0-9] 匹配非数字字符
思路解读:
获取到所有非数字的字符,将其去掉(通过Matcher的replaceAll方法将匹配到的字符替换为"",再通过trim方法去掉""),
最后转换成int返回
3.是否是国内座机号码
/**
* 是否是国内座机号码 如:0511-4405222、021-87888822
* @param number 待匹配字符串
* @return 匹配结果
*/
public boolean isTelephonenNumber(String number) {
return number.matches("\\d{3}-\\d{8}|\\d{4}-\\d{7}");
}
表达式解读:
\d{3}-\d{8}|\d{4}-\d{7}
3个数字,下划线,8个数字。即三位区号-八位电话号码
4个数字,下划线,7个数字。即四位区号-七位电话号码