正则表达式笔记 1 基本的匹配

时间:2021-07-15 07:03:42

Regex :

  • 本文介绍最基本的正则匹配规则
  • 本文的正则表达式在 Java 中测试

Java 的 java.util.regex.Pattern 类和 java.util.regex.Matcher 类的基本用法

        Pattern 类有一个静态方法 static boolean Pattern.matches(String regex, CharSequence input) 可以用来测试一个正则表达式与某串字符是否匹配;用 Pattern类的静态工厂方法 static Pattern compile(String regex) 可以产生一个 Pattern 对象,这个对象的成员方法 Matcher matcher(CharSequence input) 返回依赖于当前 Pattern 的一个 Matcher 对象,这个 Matcher 对象可以执行一些成员方法,如 find() 来查找符合它所依赖的 Pattern 对象编译好的正则表达式规则的字符串。Sample:

利用 Matcher 对象 :
   1: Pattern pattern = Pattern.compile("<正则表达式>");
   2: Matcher matcher = pattern.matcher("<待匹配的字符序列>");
   3: 
   4: while (matcher.find()) { // find() 方法寻找下一个符合的字符串,寻找完毕返回 false
   5:     System.out.println(matcher.group()); // 获取最后一个 find() 到的字符串
   6: }
利用 Pattern.matches() 方法:
 1: System.out.println(Pattern.matches("<正则表达式>", "<带匹配的字符串>")); // 匹配返回 true, 否则 false
其实还可以使用 String 类的成员方法 split 来做正则表达式的验证:
利用 String.split() 方法:
   1: String source = "<待匹配的字符串>";
   2: Sting[] result = source.split("<正则表达式>"); //把匹配到的字符串存放在一个数组里面返回
   3: foreach(String item : result) {
   4:     System.out.println(item);
   5: }

言归正传:下面介绍某种规则书写的正则表达式与哪些字符串匹配

单个字符的匹配:

  • x 匹配一个确定的字符
  • […] 匹配 [ ] 中所代表字符序列中的某一个字符
    • [aeiou] 匹配 a 或 e 或 i 或 o 或 e
    • [^aeiou] 匹配任意一个字符除了 a e i o u? (negation 取反)
    • [a-e] 匹配 a 到 e 中的任意一个字符,相当于 [abcde] (range 范围)
    • [a-eA-E] 匹配 a 到 e 中的任意一个字符或 A 到 E 中的任意一个字符
    • [a-p[w-y]] 相当于 [a-pw-y] (union 合并)
    • [a-f&&[debug]] 匹配的字符同时满足在 a-f 中且在 [debug] 中,即 (intersection 交叉)
    • [a-z&&[^aeiou]] 匹配的字符同时满足在 a-z 中且不在 [aeiou]中,即 (substraction 减法)
    • 其实只要把 && 理解为一个逻辑操作‘且’也蛮好理解的,对吧 : )。
  • 转义字符
    • \\  代表一个斜杠 ‘\’
    • \t  代表一个制表符 tab键按出来的那个
    • \n 代表一个换行符 new line
    • \r  代表一个回车符 carriage-return
    • \a 代表一个警铃 alert bell
    • \e 代表一个转义字符
    • \On 八进制值为On的字符 (0 <= n <= 7)
    • \Onn 八进制值为Onn的字符 (0 <= n <= 7)
    • \Omnn 八进制值为Omnn的字符 (0 <= m <= 3, 0 <= n <= 7)
    • \xhh 十六进制值为0xhh的字符
    • \uhhhh 十六进制值为0xhhhh的字符
    • \x{h…h} 十六进制值为0xh…h的字符 (Character.Min_CODE_POINT <= 0xh..h <= Character.MAX_CODE_POINT)
  • 预定义字符
    • 一个点代表任意字符 Note:不包括 \n,\r 等一些字符
        System.out.println(Pattern.matches(".", "\n")); --> false
    • \d 数字字符[0-9]
    • \D 非数字字符 [^0-9], [^\d]
    • \s 空白符 [\t\n\x0B\f\r]
    • \S 非空白字符 [^\s]
    • \w 单词字符 [a-zA-Z_0-9] 包括一个 _ 哦
        System.out.println(Pattern.matches("\\w", "_")); –> true
        这里之所以用两个斜杠是因为 \ 在字符串中需要用 \\ 定义,所以字符串中的 \\ 就代表一个上面所说的 \w 或者 \d 中的一个 \。
    • \W 非单词字符 [^\w]

多个字符的匹配:

  • XY 多个字符放在一起形成一个字符串,匹配的时候匹配整个字符串
      System.out.println(Pattern.matches("ggicci", "ggicci")); --> true
  • X{n} X重复n次
      System.out.println(Pattern.matches("g{2}ic{2}i", "ggicci")); --> true
  • X{n,} X重复至少n次
  • X{n,m} X重复至少n次,至多m次
      System.out.println(Pattern.matches("g{2,4}", "gggggg")); –> false
  • X? X出现1次或者什么也没有,即 “”
         1: System.out.println(Pattern.matches("g?", "g")); --> true
         2: System.out.println(Pattern.matches("g?", "")); --> true
         3: System.out.println(Pattern.matches("g?", "gg")); --> false
  • X* X不出现或者出现多次
         1: System.out.println(Pattern.matches("g*", "")); --> true
         2: System.out.println(Pattern.matches("g*", "g")); --> true
         3: System.out.println(Pattern.matches("g*", "ggg")); --> true
  • X+ X至少出现1次
         1: System.out.println(Pattern.matches("g+", "")); --> false
         2: System.out.println(Pattern.matches("g+", "g")); --> true
         3: System.out.println(Pattern.matches("g+", "gggg")); --> true