Java基础-正则表达式(二)

主要说一下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中会有详细的解释


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值