转自:https://blog.csdn.net/hansion3333/article/details/79133343
一、正则表达式
(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("需要匹配的字符串");
2.仅获取匹配的结果的写法:
String类中将上述写法封装成一个String.matches(String regex)方法:
- "需要匹配的字符串".matches("正则表达式语句");
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}");
- }