1、匹配字符串
经常需要编写代码来验证用户输入,比如验证输入是否是一个数字,是否是一个全部小写的字符串。一个简单有效的方法是用正则表达式来完成这个任务。正则表达式是一个字符串,用来描述匹配一个字符串集合的模式。对于字符串处理来说,正则表达式是一个强大的工具,可以使用正则表达式来匹配。替换和拆分字符串。
"Java".matches("Java");
这个语句的结果为true.
matches方法的功能强大。它不仅可以匹配一个固定的字符串,还可以匹配符合一个模式的字符串集。
"Java is fun".matches("Java.*");
"Java.*"是一个正则表达式。它描述了一个字符串模式,以Java开头,后面跟0个或多个字符串。
2、常用的正则表达式
正则表达式 匹配
x 指定字符x
. 任意单个字符,除了换行符外
(ab|cd) ab或cd
[abc] a.b或c
[^abc] 除了a.b或c外的任意字符
[a-z] a到z
[^a-z] 除了a到z外的任意字符
[a-e[m-p]] a到e或m到p
[a-e&&[c-p]] a到e与c到p的交集
\d 一位数字,等同[0-9]
\D 一位非数字
\w 单词字符(任何字母,数字或下划线字符,即[a-z[A-Z][0-9] _ ])
\W 非单词字符
\s 空白字符
\S 非空白字符
p* 0或多次出现模式p
p+ 1次或多次出现模式p
p? 0或1次出现模式p
p{n} 正好出现n次模式p
p{n,} 至少出现n次模式p
p{n,m} n到m(不包含)次出现模式p
\p{P} 一个标点字符!"#$%&’()*+,-./:;<=>?@[\]^_‘{|}~
示例1:社会安全号
"111-22-3333".matches("[\\d]{3}-[\\d]{2}-[\\d]{4}") return true;
示例2: 以偶数结尾
"124".matches("[\\d]*[02468]") return true;
示例3:假设电话号码模式是(XXX)XXXX-XXX,X是一位数字,且第一位不能为0
"(912)2819-421".matches("\\([1-9][\\d]{2}\\)[\\d]{4}-[\\d]{3}") return true;
括号在正则表达式中是特殊字符,用于对模式分组,必须用\\( 或者\\)
示例4:标识符由字母,数字、下划线或美元符合组成,不能以数字开头(\w表示任何字母,数字,或下划线)
[a-zA-z_$][\\w$]*
3、替换和拆分字符串
String类用正则表达式来匹配、替换和拆分字符串的方法
java.lang.String类的方法如下:
+matches(regex:String):boolean 如果字符串匹配模式,返回true
+replaceAll(regex:String,replacement:String):String 将所有匹配的子字符串替换为replacement变量中的字符串,并返回新的字符串
+replaceFirst(regex:String,replacement:String):String 将所有匹配的第一个子字符串替换为replacement变量中的字符串,并返回新的字符串
+split(regex:String):String[] 返回一个字符串数组,包含被匹配模式的分隔符拆分的子字符串
+split(regex:String,limit:int):String[] 除使用了limit参数控制模式应用的次数外,与前面的拆分方法相同。
示例:
"Java Java Java".replaceAll("v\\w","wi")); 结果为:Jawi Jawi Jawi
"Java Java Java".replaceFirst("v\\w","wi")); 结果为:Jawi Java Java
String[] tokens="hello2word3java".split("\\d");
tokens[0]=hello、tokens[1]=word、tokens[2]=java、
在+split(regex:String,limit:int):String[] 方法中,如果limit<=0, split(regex:String,limit:int)等同于split(regex:String),如果limit>0,最对匹配limit-1次。
"java1hello2word".split("\\d",0);拆分为:java,hello,word
"java1hello2word".split("\\d",1);拆分为:javahelloword
"java1hello2word".split("\\d",2);拆分为:java,helloword
"java1hello2word".split("\\d",3);拆分为:java,hello,word
"java1hello2word".split("\\d",4);拆分为:java,hello,word
默认情况下,所有的量词符都是贪婪的,这意味着它们会尽可能匹配最多次
"jaaavaa".replaceFirst("a+","R")); 显示jRvaa
可以通过在后面添加?来改变量词符的默认行为,这意味着它将匹配尽可能少的次数
"jaaavaa".replaceFirst("a+?","R"); 显示jRaavaa