正则表达式
正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。
可以使用正则表达式处理字符串,例如:匹配、替换和拆分字符串。
- 语法
正则表达式由字面值字符和特殊符号组成。
一、常用的正则表达式
代码 | 匹配 | 示例 |
x | 指定字符x | Java匹配Java |
. | 任意单个字符,除了换行符外 | Java匹配J..a |
(ab|cd) | ab或者cd | ten匹配t(en|im) |
[abc] | a、b或者c | Java匹配Ja[uvwx]a |
[^abc] | 除了ab或者c外的任意字符 | Java匹配Ja[^ars]a |
[a-z] | a到z | Java匹配[A-M]av[a-d] |
[^a-z] | 除了a到z外的任意字符 | Java匹配Jav[^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\\s2” |
\S | 非空白字符 | Java匹配”[\\S]ava” |
P* | 0或者多次出现模式p | aaaa匹配”a*” abab匹配”(ab)*” |
P+ | 1或者多次出现模式p | a匹配”a+b*” able匹配”(ab)+.*” |
P? | 0或者1次出现模式p | Java匹配”J?Java” ava匹配”J?Java” |
P{n} | 正好出现n次模式p | Java匹配”Ja{1}.*” Java不匹配”.{2}” |
P{n,} | 至少出现n次模式p | aaaa匹配”a{1,}” a不匹配”a{2,}” |
P{n,m} | n到m(不包含)次出现模式p | aaaa匹配”a{1,9}” abb不匹配”a{2,9}bb” |
\p{P} | 一个标点字符 !”#$%&’()*+,-./:;<=>?@[\]^_’{|}~ | J?a匹配”J\p{P}a” J?a不匹配”J\p{P}a” |
二、其它的正则表达式
1.社会安全号:xxx-xx-xxx (x为数字)
正则表达式为:[\\d{3}-[\\d]{2}-[\\d]{4}
例如:”111-22-3333”.matches(“[\\d]{3}-[\\d]{2}-[\\d]{4}”) returns true.
”11-22-3333”.matches(“[\\d]{3}-[\\d]{2}-[\\d]{4}”) returns false.
2.偶数以数字0、2、4、6或者8结尾。
正则表达式:[\\d]*[02468]
例如:”123”.matches(“[\\d]*[02468]”) returns false.
”122”.matches(“[\\d]*[02468]”) returns true.
3.电话号码:(xxx)xxx-xxxx (x为数字且第一位数字不为0)
正则表达式为:\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}
例如:”(912) 921-2728”.matches(“\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}”) returns true.
”921-2728”.matches(“\\([1-9][\\d]{2}\\) [\\d]{3}-[\\d]{4}”) returns false.
4.姓:(假定姓最多由25个字母组成且第一个字母为大写字母)
正则表达式:[A-Z][a-zA-Z]{1,24}
例如:”Smith”.matches(“[A-Z][a-zA-Z]{1,24}”) returns true.
”Jones123”.matches(“[A-Z][a-zA-Z]{1,24}”) returns false.
5.标识符:
正则表达式:[a-zA-Z_$][\\w$]*
6.任何字符串匹配正则表达式”.*”
- 匹配字符串
正则表达式 ”Java.*” 描述了一个字符串模式。
String类中的matches不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集,返回ture。在使用正则表达式时matches极为重要。
例如:”Java”.matches(“Java”)
“Java is fun”.matches(“Java.*”)
“Java is cool”.matches(“Java.*”)
“Java is powerful”.matches(“Java.*”)
以Java开始,后面跟0个或者多个字符串。
.*匹配0或者多个任意字符。
- 替换字符串
replaceAll方法替换所有匹配的子字符串。
replaceFirst方法替换第一个匹配的子字符串。
例如:代码:System.out.println(“Java Java Java”.replaceAll(“v\\w”,“wi”));
显示:Jawi Jawi Jawi
代码:System.out.println(“Java Java Java”.replaceFirst(“v\\w”,“wi”));
显示:Jawi Java Java
- 拆分字符串
split(regex)方法使用匹配的分隔符将一个字符串拆分为子字符串。
例如:String tokens = “Java1HTML2Perl”.split(“\\d”);
将字符串“JavaHTML2Perl”拆分为Java、HTML以及Perl并且保存在tokens[0], tokens[1]以及tokens[2]中。
split(regex,limit)方法中limit参数确定模式匹配多少次。
如果limit<=0,split(regex,limit)等同于split(regex)。
如果limit>0,模式最多匹配limit-1次。
例如:“Java1HTML2Perl”.split(“\\d”,0); 拆分为Java,HTML,Perl
“Java1HTML2Perl”.split(“\\d”,1); 拆分为Java1HTML2Perl
“Java1HTML2Perl”.split(“\\d”,2); 拆分为Java,HTML2Perl
“Java1HTML2Perl”.split(“\\d”,3); 拆分为Java,HTML,Perl
“Java1HTML2Perl”.split(“\\d”,4); 拆分为Java,HTML,Perl
“Java1HTML2Perl”.split(“\\d”,5); 拆分为Java,HTML,Perl