正则表达式基础

    正则表达式其实算是单独的技术,在各个语言中细微的区别,但本质上是一致的,都是用来描述和匹配符合某个规则的语法的字符串呗。当要验证符合某些规则,例如邮件地址什么的,使用起来就很方便。

在java中,反斜线字符 ('\') 用于引用转义构造,如jdk api表中定义的,同时还用于引用其他将被解释为非转义构造的字符。因此,表达式 \\ 与单个反斜线匹配,而 \{ 与左括号匹配。

而在不表示转义构造的任何字母字符前使用反斜线都是错误的;它们是为将来扩展正则表达式语言保留的。可以在非字母字符前使用反斜线,不管该字符是否非转义构造的一部分。

根据 Java Language Specification 的要求,Java 源代码的字符串中的反斜线被解释为 Unicode 转义或其他字符转义。因此必须在字符串字面值中使用两个反斜线,表示正则表达式受到保护,不被 Java 字节码编译器解释。例如,当解释为正则表达式时,字符串字面值 "\b" 与 单个退格字符匹配,而 "\\b" 与单词边界匹配。字符串字面值 "\(hello\)" 是非法的,将导致编译时错误;要与字符串 (hello) 匹配,必须使 用字符串字面值 "\\(hello\\)"。

以上规则在java api java.util.regex.Pattern下可以找到,总结起来就是\直接在字符串中使用的情况仅限于valid ones are  \b  \t  \n  \f  \r  \"  \'  \\这些预定义的值,以及将来可能新增的转移值,而其它所有字符串字面值一旦包含\\必须成对出现,否则会出现编译错误。(鼠标移到错误上可看到:valid ones are  \b  \t  \n  \f  \r  \"  \'  \\)。

1.最普遍而常用的方式,即验证一个String是否满足给定规则

 public static void main(String[] args) {
	// 1.最普遍而常用的方式,即验证一个String是否满足给定规则
	Pattern modelPattern = Pattern.compile("^1[34578]{1}\\d{9}");
	Matcher matcher = modelPattern.matcher("13282149093");
	//等同于下面这个式子,在pattern值使用一次的时候很方便
	Pattern.matches("^1[34578]{1}\\d{9}", "13282149093");

	String str = "13282149093";
	str.matches("^1[34578]{1}\\d{9}"); // 本质上是如上代码。此外split() replace()也是调用matcher类的方法
	System.out.println(matcher.matches());
}
String类的match方法的本质

public static boolean matches(String regex, CharSequence input) {
	  Pattern p = Pattern.compile(regex); Matcher m = p.matcher(input);
	  return m.matches(); }
2.捕获组的使用,如(A(B(C)))实际上是3个捕获组,即(A(B(C))),(B(C)),(C),可以得到每个组的信息

public static void regular() {
	// 捕获组:捕获组是把多个字符当一个单独单元进行处理的方法,它通过对括号内的字符分组来创建
	String line = "This order was placed for QT3000! OK?";
	//找到连续数字pattern
	String pattern = "(\\D*)(\\d+)(.*)";

	Pattern r = Pattern.compile(pattern);

	Matcher m = r.matcher(line);
	if (m.find()) {
	    System.out.println("Found value: " + m.group(0));//This order was placed for QT3000! OK?
	    System.out.println("Found value: " + m.group(1));//This order was placed for QT
	    System.out.println("Found value: " + m.group(2));//3000
	    System.out.println("Found value: " + m.group(3));//! OK?
	} else {
	    System.out.println("NO MATCH");
	}

    }
以上例子即要找到连续数字部分,将整个String分为了3个捕获组(group(0)默认为整个字符串)。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值