Java正则表达式量词
可以指定正则表达式中的字符的次数可以匹配字符序列。为了使用正则表达式表达一个数字或更多的模式,我们可以是用量词。下面列出了量词及其含义。
- * 0次或者更多次
- + 1次或者多次
- ? 1次或者根本不
- {m} 正好m次
- {m,} 至少m次
- {m,n} 至少m,但不超过n次
package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest { public static void main(String[] args) { String regex1 = "\\b(\\d{3})\\d{7}\\b"; Pattern pattern1 = Pattern.compile(regex1); String condidateString1 = "12345678, 12345, and 9876543210"; Matcher m1 = pattern1.matcher(condidateString1); while(m1.find()) { System.out.println("phone Number: " + m1.group() + " area Code: " + m1.group(1)); } }}
Matcher.group函数的用法:group()是针对()来说的,group(0)就是指整个串,group(1)指的是第一个括号里的东西,group(2)指的是第二个括号里的东西。
Java正则表达式边界
要匹配一行的开头,或匹配整个单词,不是任何单词的一部分,必须为匹配器设置边界。下面列出了正则表达式中的边界匹配器。
- ^ 一行的开始
- $ 一行的结束
- \b 字边界
- \B 非字边界
- \A 输入的开始
- \G 上一次匹配结束
- \Z 输入的结束,但是对于最终终止符,如果有的话
- \z 输入的结束
String regex = "\\bJava\\b"; String condidateString = "Java and Javascript"; String replaceString = "XML"; String newString = condidateString.replaceAll(regex, replaceString); System.out.println(newString);
运行结果:
如果将condidateString 改成“Java and Java script”呢?
Java正则表达式组
可以通过括号将多个字符组合为一个单位,例如,(ab)。正则表达式中的每个组都有一个组号,从1开始。Matcher类中的方法groupCount()返回的是正则表达式字符串中"()"的数量。正则表达式中的每个左括号标记新组的开始。
也可以在正则表达式中返回引用组号:假设我们要匹配“abc”开头,后面跟“xyz”的文本,后面跟“abc”,我们可以写一个正则表达式"abcxyzabc",也可以使用反向引用将正则表达式重写为:“(abc)xyz\\1” ,\1指第一组,即(abc)。\2引用组2,\3引用组3,依次类推。
格式化电话号码的例子:
package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest { public static void main(String[] args) { //Formart Phone Number String regex2 = "(\\d{3})(\\d{3})(\\d{4})"; String condidateString2 = "1234567890, 12345, and 9876543210"; Matcher m3 = Pattern.compile(regex2).matcher(condidateString2); while( m3.find() ) { System.out.println("Origional Phone Number : " + m3.group(0) + " Formart Phone Number : "+ "(" + m3.group(1) + ")" + m3.group(2) + "-" + m3.group(3)); } }}
运行结果:
以下代码显示如何引用替换文本中的组。
$n,其中n是组编号,替换文本内部是指组n的匹配文本。例如$1指第一个匹配的组,要重新格式化电话号码,将使用($1) $2-$3.
package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest { public static void main(String[] args) { //Formart Phone Number String regex2 = "(\\d{3})(\\d{3})(\\d{4})"; String condidateString2 = "1234567890, 12345, and 9876543210"; Matcher m3 = Pattern.compile(regex2).matcher(condidateString2); String replaceText = "($1)$2-$3"; System.out.println(m3.replaceAll(replaceText)); }}
运行结果:
Java正则表达式命名组
可以在正则表达式中使用命名组,可以命名一个组,然后使用它们的名字来引用参考组。
定义命名组的格式为:
(?pattern)
仍然是上面的格式化电话号码的例子,其中使用了命名组:
package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest { public static void main(String[] args) { //Formart Phone Number String regex2 = "(\\d{3})(\\d{3})(\\d{4})"; String regex3 = "(?\\d{3})(? \\d{3})(? \\d{4})"; String condidateString2 = "1234567890, 12345, and 9876543210"; Matcher m3 = Pattern.compile(regex2).matcher(condidateString2); String replaceText = "($1)$2-$3"; String repalceText1 = "(${areaNumber})${prefixPhoneNumber}-${postPhoneNumber}"; System.out.println(m3.replaceAll(replaceText)); Matcher m4 = Pattern.compile(regex3).matcher(condidateString2); System.out.println(m4.replaceAll(repalceText1)); }}
运行结果:
Java正则表达式组边界
可以使用start()和end()方法来获取组的匹配边界。这些方法重载:
int start()int start(int groupNumber)int start(String groupName)int end()int end(int groupNumber)int end(String groupName)
例子,显示如何匹配10位电话号码,并未每个成功匹配打印每个组的开始:
package com.fpc.Test;import java.util.regex.Matcher;import java.util.regex.Pattern;public class regexTest { public static void main(String[] args) { //Formart Phone Number String regex2 = "(\\d{3})(\\d{3})(\\d{4})"; String regex3 = "(?\\d{3})(? \\d{3})(? \\d{4})"; String condidateString2 = "1234567890, 12345, and 9876543210"; String repalceText1 = "(${areaNumber})${prefixPhoneNumber}-${postPhoneNumber}"; Matcher m4 = Pattern.compile(regex3).matcher(condidateString2); while ( m4.find() ) { int start1 = m4.start("areaNumber"); int start2 = m4.start("prefixPhoneNumber"); int satart3 = m4.start("postPhoneNumber"); System.out.println("Matched Text:" + m4.group(0)); System.out.println("Area code start:" + start1); System.out.println("Prefix start:" + start2); System.out.println("Post Number start:" + satart3); } }}
运行结果:
Matched Text:1234567890Area code start:0Prefix start:3Post Number start:6Matched Text:9876543210Area code start:23Prefix start:26Post Number start:29