正则表达式由字面值字符和特殊符号组成。
| 正则表达式 | 匹配 | 示例 |
|---|---|---|
| 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匹配"Jp{P}a" J?1a不匹配"Jp{P}a" |
注意
-
反斜杠是一个特殊的字符,在字符串中开始转义序列。因此在Java中需要使用 来表示
-
空白字符是' '、't'、'n'、'r'、'f',因此,s和[tnrf]等同,S和[ ^tnrf]等同
-
单词字符是任何的字母、数字或者下划线字符,因此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


