正则表达式学习汇总

Posted heibaimao123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式学习汇总相关的知识,希望对你有一定的参考价值。

正则表达式是一种工具,用于匹配和处理文本的字符串。正则表达式使用正则表达式语言来实现的。

它的优点是:功能强大,语言简洁。

缺点:不容易识读。 

(本篇文章以Eclipse+Java来验证)

在Java中使用正则表达式,需要引入java.util.regex包中的三个类:Pattern类、Matcher类和PatternSyntaxException.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
        public static void main(String[] args) {
        String str = "fes.onfe";
        Pattern pattern =Pattern.compile("\\.");
        Matcher matcher = pattern.matcher(str);
        if(matcher.find()) {
            System.out.println(matcher.group(0));
        }
        System.out.println(str);
    }
}

Pattern用于创建正则表达式的规则,Matcher(相当于引擎)用于执行正则表达式,Matcher的对象matcher就是执行的结果。

一、匹配单个字符

匹配纯文本

    String str = "My name is Ben, I‘m Ben";
    Pattern pattern =Pattern.compile("Ben");
    Matcher matcher = pattern.matcher(str);
    if(matcher.find()) {
         System.out.println(matcher.group(0));
     // System.out.println(matcher.group(1));
         System.out.println(matcher.group());
     }    

group()和group(1)输出都是Ben,而group(1)则报错。

  • 有多个匹配结果时,绝大多数正则表达式引擎的默认行为是只返回第一个匹配结果,即matcher对象只有一个Ben字符串。
  • 绝大多数的引擎都提供了一种能够把所有的匹配结果都找出来的机制。通常返回为1个数组或是其他的专用格式。
  • 正则表达式区分大小写。大多数引擎也支持不区分字母大小写的匹配操作。

匹配任意字符

.字符(英文句号)可以匹配任何一个单个的字符、字母、数字甚至是.字符本身。

匹配特殊字符(元字符)

\是一个元字符,.字符在正则表达式里有着特殊的含义,如果模式里需要一个.字符,就需要在.字符的前面加上一个\(反斜杠)字符来对它进行转义。

在Java中,需要用 \\. 来表示.字符本身。

二、匹配一组字符中的一个

匹配多个字符中的某一个

使用元字符[和]来定义一个字符集和,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。

[ns]a可以匹配na,也可以匹配sa。

[Rr]可以用于匹配不区分大小写的r。

利用字符集和区间

为了简化字符区间,使用元字符-(连字符)进行定义。

  • [0-9]与[0123456789]等价
  • A-Z匹配A-Z的所有大写字母
  • a-z匹配a到z的所有小写字母
  • A-F匹配A-F的所有大写字母
  • A-z匹配ASCII字符A到z的所有字母
  • *匹配字母数字区间[A-Za-z0-9]

取非匹配

用元字符^来表明对一个字符集合进行取非匹配,[^0-9]表示不取0-9的任何一个数,除此之外的任意字符都可取。

^的效果将作用于给定字符集合里的所有字符或字符区间,而不是仅限于跟在^字符后面的那一个字符或字符区间。

三、使用元字符

对特殊字符进行转义

在元字符的前面加上一个反斜杠就可以对它进行转义,进而表示元字符本身。(在Java中需要加俩个反斜杠,\\.表示.  \\\\表示\)

匹配空白字符

\n 换行符

\r 回车符

\t 制表符

匹配特定的字符类别

 \d 任何一个数字字符(等价于[0-9])

\D 任何一个非数字字符(等价于[^0-9])

\w 任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_])

\W 任何一个非字母数字或非下划线字符(等价于[^a-zA-Z0-9_])

\s 任何一个空白字符(等价于[\f\n\r\t\v])

\S 任何一个非空白字符(等价于[^\f\n\r\t\v])

使用POSIX字符类

 

在此之前的都是匹配单个字符或字符区间中的一个字符,即需要匹配的字符串的长度是固定的,而接下来将展示如何匹配多个字符,匹配到的字符串的长度不一定

四、重复匹配

有多少各匹配

匹配一个或多个字符

  +匹配一个或多个字符(至少一个:不匹配零个字符),a+匹配一个或多个连续出现的a。

匹配零个或多个字符

  *匹配零个或多个字符,用法与+相同。

匹配零个或一个字符

  ?只能匹配一个字符()的零次或一次出现,最多不超过一次

匹配的重复次数

为重复匹配次数设定一个精确的值

  {3}意味着模式里的前一个字符(或字符集合)必须在原始文本里连续重复出现3次才算是一个匹配。

为重复匹配次数设定一个区间。

  {2,4}最少重复2次、最多重复4次。

匹配“至少重复多少次”

  {3,}最少重复3次

*防止过度匹配

贪婪型元字符    懒惰型元字符

*          *?

+          +?

{n, }          {n, }?

 String str = "a <B>AK</B> AND <B>HI</B>";
        Pattern pattern =Pattern.compile("<B>.*</B>");
        Matcher matcher = pattern.matcher(str);
        Pattern pattern2 =Pattern.compile("<B>.*?</B>");
        Matcher matcher2 = pattern2.matcher(str);
        if(matcher.find()) {
            System.out.println(matcher.group());
        }
        if(matcher2.find()) {
            System.out.println(matcher2.group());
        }

第一个匹配输出的是<B>AK</B> AND <B>HI</B>

第二个输出的是<B>AK</B>

即贪婪模式是在符合匹配条件的情况下尽可能匹配长的字符串。

懒惰模式是在符合匹配条件的情况下尽可能匹配短的字符串。

五、位置匹配

边界

单词边界

字符串边界

六、使用子表达式

七、回溯应用:前后一致

八、前后查找

前后查找

向前查找

向后查找

把向前查找和向后查找结合起来

对前后查找取非

九、嵌入条件

 

以上是关于正则表达式学习汇总的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式学习汇总

常用的正则表达式代码汇总

正则表达式常用用法汇总

通过 Java 正则表达式提取 semver 版本字符串的片段

Linux三剑客正则表达式常用字符汇总

Python学习笔记之正则表达式