目录
[Java 正则表达式](#Java 正则表达式)
Java 正则表达式
1、结构组成
元字符
用于构建正则表达式的符号,常用的有
|---------|----------------------------------------------------------------------|
| 符号 | 描述 |
| . | 查找任意的单个字符,除换行符外 |
| \w | 任意一个字母或数字或下划线,A_Za_Z09,中任意一个 |
| \W | 查找非单词的字符,等价于[^A_Za_z09 |
| \d | 匹配一个数字字符,等价于[0-9] |
| \D | 匹配一个非数字字符,等价于[^0-9] |
| \s | 匹配任何空白字符,包括空格,制表符,换行符等等。等价于[\f\n\r\t\v] |
| \S | 匹配任何非空白字符,等价于[^\f\n\r\t\v] |
| \b | 匹配一个单词边界,也就是指单词和空格间的位置,比如'er\b'可以匹配"never"中的"er",但是不能匹配"verb"中的"er" |
| \B | 匹配非单词边界,'er\B'能匹配'verb'中的'er',但不能匹配'never'中的'er' |
| \0 | 匹配非单词边界,'er\查找NUL字符。 |
| \n | 匹配一个换行符 |
| \f | 匹配一个换页符 |
| \r | 匹配一个回车符 |
| \t | 匹配一个制表符 |
| \v | 匹配一个垂直制表符 |
| \xxx | 查找一个以八进制数xxx规定的字符 |
| \xdd | 查找以16进制数dd规定的字符 |
| \uxxxx | 查找以16进制数的xxxx规定的Unicode字符。 |
| \num | 这里的num指number,也就是数字,当\后面跟数字,表示匹配第几个括号中的结果 |
其实常用的几个可以简单记为下面的几个意思:
\s : 空格
\S : 非空格
\d : 数字
\D : 非数字
\w : 字符 ( 字母 ,数字,下划线_ )
\W : 非字符例子:是否有不是数字的字符
ab(c)d\1:等同于 abcdc 。
量词
用于限定子模式出现在正则表达式的次数。
符号 | 描述 |
---|---|
+ | 匹配一次或多次,相当于{1,} |
* | 匹配零次或多次 ,相当于{0,} |
? | 匹配零次或一次 ,相当于{0,1} |
{n} | 匹配n次 |
{n,m} | 匹配至少n个,最多m个某某的字符串 |
{n,} | 匹配至少n个某字符串 |
位置符号
符号 | 描述 |
---|---|
$ | 结束符号,例子:n$,匹配以n结尾的字符串 |
^ | 起始符号,例如^n,匹配以n开头的字符串 |
?= | 肯定正向环视,例:?=n,匹配其后紧接指定的n字符串 |
?! | 否定正向环视,例如:?!n,匹配其后没有紧接指定的n字符串 |
?: | 表示不匹配 |
注意点:
刚开始学习正则的时候,是比较容易混淆 ^
: 放在正则的最开始位置,就代表起始的意思,放在中括号里,表示排除的意思。也就是说,/[^a]/和/^[a]/是不一样的,前者是排除的意思,后者是代表首位
$:正则的最后位置,就代表结束的意思.
分组
符号 | 描述 |
---|---|
| | 选择(不是他就是她) | (竖线) 则表示或的关系,表示检测的字符串须满足其中一个时,才符合条件。 |
(...) | 分组 |
字符类
符号 | 描述 |
---|---|
[ ] | [ ] 表示匹配其中任意一个字符。 |
[值1-值2] | [值1-值2] 则表示值1到值2中间的所有字符都满足(包括值1和值2)。常用该正则来表示大小写字母范围,数字范围。 |
[0-9] | 匹配 0 到 9 间的字符 |
[a-zA-Z] | 匹配任意字母 |
[^ ] | [^ ] 表示不与中括号里的任意字符匹配。 |
[^0-9] | 不等于0到9的其它字符 |
()分组符号可以理解为,数学运算中的括号,用于计算的分组使用。[]可以理解为,只要满足括号里面其中的某种条件即可。比如[abc],意思是满足abc中的某一个,这样比较好记。
贪婪模式和非贪婪模式
其实可以简单的理解,贪婪模式就是尽可能多的匹配,非贪婪模式就是尽可能少的匹配.
贪婪模式量词: {x,y} , {x,} , ? , * , 和 +
非贪婪模式量词: {x,y}?,{x,}?,??,*?,和 +?
,所以非贪婪模式就是在贪婪模式后面加了一个问号
零宽正向断言和负向断言
(?=)
零宽正向断言: 括号内表示某个位置右边必须和=右边匹配上(?!)
负向断言: 括号内表示某个位置右边不和!后的字符匹配。
vbscript
只能输入数字:^[0-9]*$。
只能输入n位的数字:^\d{n}$。
只能输入至少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-9][]0-9*$
只能输入长度为3的字符:^.{3}$
只能输入由26个英文字母组成的字符串:^[A-Za-z]+$
只能输入由26个大写英文字母组成的字符串:^[A-Z]+$
只能输入由26个小写英文字母组成的字符串:^[a-z]+$
只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
只能输入由数字、26个英文字母或者下划线组成的字符串:^w+$
验证用户密码:^[a-zA-Z]w{5,17}$"正确格式为:以字母开头,长度在6~18之间,只能包含字符、数字和下划线。
验证是否含有^%&',;=?$""等字符:[^%&',;=?$"x22]+
只能输入汉字:^["u4e00-"u9fa5]{0,}$
验证Email地址:/^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/
验证InternetURL:^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$
验证电话号码:^((d{3,4}-)|d{3.4}-)?d{7,8}$正确格式为:"XXX-XXXXXXX"、"XXXX- XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX"。
验证身份证号(15位或18位数字):^d{15}|d{18}$
验证一年的12个月:^(0?[1-9]|1[0-2])$正确格式为:"01"~"09"和"1"~"12"。
验证一个月的31天:^((0?[1-9])|((1|2)[0-9])|30|31)$正确格式为;"01"~"09"和"1"~"31"。
2、正则案例使用
Java正则表达式去除字符串中的中文
java
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class T1Main {
public static void main(String[] args) {
String str = "123abc呵呵fuc";
String reg = "[\u4e00-\u9fa5]";
Pattern pattern = Pattern.compile(reg);
Matcher matcher=pattern.matcher(str);
String newStr = matcher.replaceAll("");
System.out.println("去除中文后的字符串:" + newStr);
}
}
Java中的正则校验
正则表达式主要用途就是校验字符串,那么在Java中,只需要通过下面这个方法即可进行校验。
java
boolean result = Pattern.matches(regex, input);
其中:
regex 是我们需要写的正则表达式校验规则;
input 是我们待校验的字符串;
返回的 result 就是我们校验的结果,当为 true 的时候,表示校验通过,当为 false 的时候,则表示校验不通过。
分组/替换
比如,想把yyyy-mm-dd格式,替换成mm/dd/yyyy怎么做?
java
public static void main(String[] args) {
String regex = "(\\d{4})-(\\d{2})-(\\d{2})";
String dateStr = "2017-06-12";
System.out.println(dateStr.replaceAll(regex,"$2/$3/$1"));
}
排除字符
字符串中想匹配不包括"TWN","HKG","MAC"的字符串
java
public static void main(String[] args) {
String regex1 = "^(?!(HKG|MAC|TWN))[A-Z]{3}$";
String input1 = "MAC";
String input2 = "MAA";
System.out.println(Pattern.matches(regex1,input1));//false
System.out.println(Pattern.matches(regex1,input2));//true
}
再小的努力,乘以365都很明显!
一个程序员最重要的能力是:写出高质量的代码!!
有道无术,术尚可求也,有术无道,止于术。
无论你是年轻还是年长,所有程序员都需要记住:时刻努力学习新技术,否则就会被时代抛弃!