1.介绍
正则表达式(regular expression)是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串的处理,正则表达式是一个强大的工具。可以使用正则表达式来匹配、替换、拆分字符串。
2.匹配字符串
以String类中的matches和equals方法为例,以下两个语句结果都为true
"Java".matches("Java");
"Java".equals("Java");
然而,matches方法功能更加强大。它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集。例如,以下语句结果都为true。
"Java is fun".matches("Java.*");
"Java is cool".matches("Java.*");
"Java is powerful".matches("Java.*");
前面语句中的“Java.*”是一个正则表达式。它描述了一个字符串模式,以Java开始,后面跟0个或多个字符串。这里,子字符串.*匹配0或者多个任意字符。
3.正则表达式语句
正则表达式由字面值字符和特殊符号组成。
注意:反斜杠是一个特殊的字符,在字符串中开始专一序列。因此Java中需要使用\\来表示\。
正则表达式 | 匹配 | 示例 |
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[^ars]a |
[a-z] | a到z | Java匹配[A-M]av[a-d] |
[^a-z] | 除了a到z外的任意字符 | Java匹配[^b-d] |
[a-e[m-p]] | a到e或m到p | Java匹配[A-G[I-M]]av[a-d] |
[a-e&&[m-p]] | a到e与m到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?ava“ |
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" |
4.替换和拆分字符串
如果字符串匹配正则表达式,String类的matches方法返回true。String类也包含repalceAll、replaceFirst和split方法,用于替换和拆分字符串。
replaceAll方法替换所有匹配的子字符串,replaceFirst方法替换第一个匹配的子字符串。
System.out.println("Java Java Java".replaceAll("v\\w","wi"));
显示
Jawi Jawi Jawi
注意:默认情况下,所有的量词符都是“贪婪”的。这以为这它们会尽可能匹配最多次。
比如,下面的语句显示JRvaa。因为第一匹配成功的是aaa。
System.out.println("Jaaavaa".replaceFirst("a+","R"));
可以通过在后面添加问号(?)来改变量词符的默认行为。量词符变为“不情愿”或“惰性”的,这意味着它将匹配尽可能少的次数。例如,下面语句显示JRaavaa,因为第一瓜匹配成功的是a。
System.out.println("Jaaavaa".replaceFirst("a+?',"R"));
以上内容来源于《Java语言程序设计与数据结构 基础篇》仅供大家参考,欢迎批评指正!