正则表达式基础

来源:互联网 发布:上海数据交易中心官网 编辑:程序博客网 时间:2024/06/16 03:23

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

在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?";//找到连续数字patternString 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
原创粉丝点击