目录
- 正则表达式语法
- 重复匹配
- 懒惰匹配和贪婪匹配
- 特殊字符匹配
- 反向匹配
- 范围匹配
- 分组匹配
- Java常用正则表达式
- **用法**
- 数字
- 字符串
- 功能验证
正则表达式定义了字符串的模式。
正则表达式可以用来搜索、编辑或处理文本。
正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。
正则表达式语法
在 Java 中,\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。
所以,在其他的语言中(如 Perl),一个反斜杠\ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。也可以简单的理解在 Java 的正则表达式中,两个 \ 代表其他语言中的一个 \,这也就是为什么表示一位数字的正则表达式是 \d,而表示一个普通的反斜杠是 \。
System.out.print("\\"); // 输出为 \
System.out.print("\\\\"); // 输出为 \\
说明 | |
\ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n匹配字符 n。\n 匹配换行符。序列 \\ 匹配 \ ,\( 匹配 (。 |
^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。 |
$ | 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与"\n"或"\r"之前的位置匹配。 |
重复匹配
采用限定字符用于重复匹配次数前面的字符或子表达式
* | 零次或多次匹配。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。 |
+ | 一次或多次匹配。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。 |
? | 零次或一次匹配。例如,"do(es)?“匹配"do"或"does"中的"do”。? 等效于 {0,1}。 |
{n} | 正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。 |
{n,} | 至少匹配 n 次。例如,"o{2,}“不匹配"Bob"中的"o”,而匹配"foooood"中的所有 o。"o{1,}“等效于"o+”。"o{0,}“等效于"o*”。 |
{n,m} | m 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。‘o{0,1}’ 等效于 ‘o?’。注意:您不能将空格插入逗号和数字之间。 |
懒惰匹配和贪婪匹配
当此字符 **?**紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?“只匹配单个"o”,而"o+“匹配所有"o”。
特殊字符匹配
代码 | 说明 |
. | 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用"[\s\S]"之类的模式。 |
\w | 匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
\d | 数字字符匹配。等效于 [0-9]。 |
\b | 匹配单词的开始或结束。例如,“er\b"匹配"never"中的"er”,但不匹配"verb"中的"er"。 |
\r | 匹配一个回车符。等效于 \x0d 和 \cM。 |
\n | 换行符匹配。等效于 \x0a 和 \cJ。 |
反向匹配
采用反向字符,多用于查找除某个字符以外其他任意字符均可以的情况,特殊字符用大写字母表示。
代码 | 说明 |
\W | 与任何非单词字符匹配。与[^A-Za-z0-9_]等效。 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^ae] | 匹配除了ae这几个字母以外的任意字符 |
[^a-z] | 反向范围字符。匹配不在指定的范围内的任何字符。 |
范围匹配
代码 | 说明 |
x|y | 匹配 x 或 y。例如,‘z|food’ 匹配"z"或"food"。‘(z|f)ood’ 匹配"zood"或"food"。 |
[xyz] | 字符集。匹配包含的任一字符。例如,"[abc]“匹配"plain"中的"a”。 |
[a-z] | 字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。 |
分组匹配
主要通过使用小括号()来进行分组
(\d\w){3} 重复匹配3次(\d\w)
IP地址 形如:
((25[0-5]|2[0-4][0-9]|[0-1]\d\d).){3}(25[0-5]|2[0-4][0-9]|[0-1]\d\d)
Java常用正则表达式
用法
import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String content = "01";
String pattern = "^[0-9]*$";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println( isMatch);//true
}
}
数字
整数或者小数
^[0-9]+\.{0,1}[0-9]{0,2}$
只能输入数字
^[0-9]*$
说明:空字符串也可以,0,01,…
只能输入n位的数字
^\d{n}$
用法:
复制到编译器会自动将\变成两个\
import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String content = "01";
String pattern = "^\\d{2}$";
boolean isMatch = Pattern.matches(pattern, content);
System.out.println( isMatch);//true
}
}
只能输入至少n位的数字
^\d{n,}$
只能输入m~n位的数字
^\d{m,n}$
只能输入零和非零开头的数字
^(0|[1-9][0-9]*)$
只能输入有两位小数的正实数
^[0-9]+(.[0-9]{2})?$
只能输入有1~3位小数的正实数
^[0-9]+(.[0-9]{1,3})?$
只能输入非零的正整数
^\+?[1-9][0-9]*$
比如:+1,1…
只能输入非零的负整数
"^\\-[1-9][0-9]*$"
或
^\-[1-9][0-9]*$
比如:-1
字符串
只能输入长度为3的字符
^.{3}$
只能输入由26个英文字母组成的字符串
^[A-Za-z]+$
只能输入由26个大写英文字母组成的字符串
^[A-Z]+$
只能输入由26个小写英文字母组成的字符串
^[a-z]+$
只能输入由数字和26个英文字母组成的字符串
^[A-Za-z0-9]+$
只能输入由数字、26个英文字母或者下划线组成的字符串
^\w+$
或
"^\\w+$"
验证用户密码:
^[a-zA-Z]\w{5,17}$
以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证特殊字符
[^%&',;=?$]+
验证是否不含有特殊字符^%&',;=?$
等,如1返回true,%返回false
只能输入汉字
^[\u4e00-\u9fa5]{0,}$
功能验证
验证Email地址
^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
验证Internet URL
^[http|https]://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
验证电话号码
^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
正确格式为:XXX-XXXXXXX、XXXX- XXXXXXXX、XXX-XXXXXXX、XXX-XXXXXXXX、XXXXXXX和XXXXXXXX
验证一年的12个月
^(0?[1-9]|1[0-2])$
如:01-12或1-12
匹配帐号是否合法
^[a-zA-Z][a-zA-Z0-9_]{4,15}$
字母开头,允许5-16字节,允许字母数字下划线
匹配国内电话号码
\d{3}-\d{8}|\d{4}-\d{7}
匹配形式如 0511-4405222 或 021-87888822
匹配腾讯QQ号
[1-9][0-9]{4,}
腾讯QQ号从10000开始
匹配中国邮政编码
[1-9]\d{5}(?!\d)
中国邮政编码为6位数字
匹配ip地址
\d+\.\d+\.\d+\.\d+
校验密码强度
例如密码的强度为:包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
由数字、26个英文字母或下划线组成的字符串
^\\w+$
校验身份证号码
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
第一代居民身份证是15位编码。2004年1月1日,第二代居民身份证开始换发,第一代居民身份证已经于2013年1月1日正式退出。我国二代居民身份证的号码为18位。
校验日期
“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
校验金额
精确到2位小数。
^[0-9]+(.[0-9]{2})?$
校验手机号
下面是国内 13、15、18开头的手机号正则表达式。
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
可根据目前国内收集号扩展前两位开头号码