主要说一下Pattern Matcher
情景:有如下字符串"Hello, my phone number is 15618911111 ,my birthday is 19880101.",我们想提取其中的电话号码(不是很严谨的去判断是否是手机号码,只简单的从位数上判断是否为一个手机号码的条件)。此处我们定义的表达式可以为“\\d{11}”,一个恰好为是一位的数字。而我们用什么来接收符合条件的字符串呢。此处就要Pattern和Matcher派上用场了。在JDK文档中Pattern被描述为:正则表达式的编译表示形式。Pattern由Pattern.compile()获取一个实例,再由此实例的matcher方法获取一个Matcher对象,这个Matcher对象就可以对匹配的字符串进行操作了(具体的有哪些方法可以参照文档)。下面我们就来解决上面的情景问题。
package net.csdn.blog.iPolaris.javatest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaTest {
static String testStr = "Hello, my phone number is 15618911111.My birthday is 19880101.";
static String regex = "\\d{11}";
public static void main(String[] args) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(testStr);
while (matcher.find()) {
System.out.println(matcher.group()+" start:"+matcher.start()+" end:"+matcher.end());
}
}
}
运行的结果如下:
这样你就可以对匹配的字符串进行操作了。
此处还是有很多不严谨的地方,匹配11位数,当一串数字大于11位时,上述的表达式还是匹配的,此时我们应该考虑一个手机号码前后的字符的问题了。号码前前后是不允许出现数字的。然后我们使用如下的表达式(?<!\\d)\\d{11}(?!\\d),我们换一个情景字符串“00000000000 1111111111111 22222222222 33333333333”,0,2,3都是11位,1为13位,让我们看看结果:
package net.csdn.blog.iPolaris.javatest;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaTest {
static String testStr = "00000000000 1111111111111 22222222222 33333333333";
static String regex = "(?<!\\d)\\d{11}(?!\\d)";
public static void main(String[] args) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(testStr);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
0,2,3都筛选出来了,在使用的表达是中有有一处是需要说明一下的(?<!\\d)X表示X前不允许出现的字符,在文档是这样描述这种形式的
说的相当模糊,不和很容易懂。简要的说一下。首先括号出现的?表示括号内匹配的记过不存到内存中= !分别表示其后允许和不允许出现匹配的内容比如上述的表达式(?!\\d),表示气候不允许出现数字。而像<!就表示之前不允许,其他的一次类推,都可以试一试。正则表达式说不复杂其实也不是很复杂,关键要灵活,还要知道各字符表示什么意思。现在我们可以利用正则表达式过滤邮箱,网址等一些有格式的字符串了
关于正则表达式中各字符的含义,可以查阅文档http://www.cjsdn.net/Doc/JDK60/ 在 java.util.regex.Pattern中会有详细的解释