常用语法
正则表达式由字面值字符和特殊符号组成。
正则表达式 | 匹配 | 示例 |
---|---|---|
x | 指定字符x | Java匹配Java |
. | 除了换行符外的任意单个字符 | Java匹配J..a |
(ab|cd) | ab或者cd | ten匹配t(en|im) |
[abc] | a、b或者c | Java匹配Ja[uvwx]a |
[^abc] | 除了a、b或c之外的字符 | Java匹配Ja[ ^asx]a |
[a-z] | a到z | Java匹配[A-M]av[a-z] |
[^a-z] | 除了a-z之外的任意字符 | Java匹配[ ^A-C]av[ ^b-d] |
[a-e[m-p]] | a到e或m-p | Java匹配[A-G[I-M]]av[a-d] |
[a-e&&[c-p]] | a到e与c到p的交集 | Java匹配[A-P&&[I-M]]av[a-d] |
\d | 一位数字,等同于[0-9] | Java2匹配"Java[\\d]" |
\D | 一位非数字 | $Java匹配"[\\D][\\D]ava" |
\w | 单词字符 | Java1匹配"[\\w]ava[\\d]" |
\W | 非单词字符 | $Java匹配"[\\W][\\w]ava" |
\s | 空白字符 | "Java 2"匹配"Java[\\s]2" |
\S | 非空白字符 | Java匹配"[\\S]ava" |
p* | 0或者多次出现模式p | aaaa匹配"a*" |
p+ | 1或者多次出现模式p | a匹配"a+b*" able匹配"(ab)+. *" |
p? | 0此或者1次出现模式p | Java匹配"J?Java" ava匹配"J?ava" |
p{n} | 正好出现n次模式p | Java匹配"Ja{1}.*" |
p{n,} | 至少出现n次模式p | aaaa匹配"a{1,}" a不匹配"a{2,}" |
p{n,m} | [n,m]次出现模式p | aaaa匹配"a{1,9}" abb不匹配"a{2,9}b{2}" |
\p{P} | 一个标点字符!"#$%&'()*+,-./:;<=>?@[\]^_'{|}~ | J?a匹配"J\p{P}a" J?1a不匹配"J\p{P}a" |
注意
-
反斜杠是一个特殊的字符,在字符串中开始转义序列。因此在Java中需要使用\ \来表示\
-
空白字符是' '、'\t'、'\n'、'\r'、'\f',因此,\s和[\t\n\r\f]等同,\S和[ ^\t\n\r\f]等同
-
单词字符是任何的字母、数字或者下划线字符,因此\w等同于[a-z[A-Z] [0-9]_],或者简化为[a-Za-z0-9_],\W等同于[ ^a-Za-z0-9_]
-
上表中的后面6个条目*、+、?、{n}、{n,}以及{n,m}称为量词符,用于确定量词符前面的模式会重复多少次。
-
不要在重复量词符中使用空白,例如A{3,6}不能写成逗号后面有一个空白符的A{3, 6}
-
可以使用括号来将模式进行分组,例如,(ab){3}匹配ababab,但是ab{3}匹配abbb
示例
-
社会安全号的模式是xxx-xx-xxxx,其中x是一位数字,其正则表达式可以为:
[0-9]{3}-[0-9]{2}-[0-9]{4}
或者[\\d]{3}-[\\d]{2}-[\\d]{4}
:"111-22-3333".matches("[0-9]{3}-[0-9]{2}-[0-9]{4}");//true "111-22-333".matches("[0-9]{3}-[0-9]{2}-[0-9]{4}");//false
-
偶数以数字0、2、4、6、8结尾,偶数的模式可以描述为:
[0-9]*[02468]
或者[\\d]*[02468]
-
电话号码的模式是(xxx)xxx-xxxx,其中x是一位数字,并且第一位数字不能为0,其正则表达式可以为:
\\([1-9][0-9]{2}\\)[0-9]{3}-[0-9]{4}
或者\\([1-9][\\d]{2}\\)[\\d]{3}-[\\d]{4}
-
假定姓由最多25个字母组成,并且第一个字母为大写形式,则姓的模式可以描述为:
[A-Z][a-z[A-Z]]{1,24}
-
Java中的标识符必须以字母、下划线、或者美元符号开头,不能以数字开头;必须由字母、数字、下划线、美元符号组成的字符序列,则标识符的模式可以描述为:
[a-zA-z_$][a-Za-z0-9$_]*
或者[a-zA-z$_][\\w$]*
-
".*"匹配任何字符串
用正则表达式替换和拆分字符串
-
matches()方法匹配字符串
-
replaceAll()方法替换所有匹配的子字符串
"Java Java Java".replaceAll("v\\w","wi");//Jawi Jawi Jawi
-
replaceFirst()方法替换第一个匹配的子字符串
"Java Java Java".replaceFirst("v\\w","wi");//Jawi Java Java
-
重载了split(regex)方法,使用匹配的分隔符将一个字符串拆分为子字符串
"Java1HTML2Perl".split("\\d");//拆分为Java,HTML,Per
-
spilt(regex,llimit)方法,limit参数确定匹配模式匹配多少次,如果limit<=0,spilt(regex,llimit)等同于spilt(regex);如果limit>0,模式最多匹配limit-1次
"Java1HTML2Perl".split("\\d",0);//拆分为Java,HTML,Per "Java1HTML2Perl".split("\\d",1);//拆分为Java1HTML2Per "Java1HTML2Perl".split("\\d",2);//拆分为Java,HTML2Per "Java1HTML2Perl".split("\\d",3);//拆分为Java,HTML,Per "Java1HTML2Perl".split("\\d",4);//拆分为Java,HTML,Per
注意
在默认情况下,所有的量词符都会尽可能匹配多次。在后面添加问号?来把量词符改成匹配尽可能少的次数
"Jaaavaa".replaceFirst("a+","R");//JRva,匹配aaa
"Jaaavaa".replaceFirst("a+?","R");//JRaava,匹配a