看了一篇讲的很通透的正则表达式,总算不用痛苦记忆了

正则表达式说白了就是一堆约定俗成的匹配规则。如果从微观入手,你会发现有背不完的规则;如果从宏观入手,你会发现万变不离其宗。所以我们将从宏观到微观依次说起,依次为大家总结三大宏观规则、两大微观规则,再附带一部分高级内容。基本可以通过一篇文章让大家理解正则表达式的主要用法。------来源:正则表达式入门

强烈推荐有需要的大家先看看上面这篇

以下是笔者学习后总结整理方便记忆

1、三大宏观

一、交集规则。

EF一个正则,表示同时匹配EF的内容

二、并集规则

E|F也是一个正则,表示匹配E或者匹配F,[EFGH]跟写成E|F|G|H效果是一样

三、补集规则

要排除匹配EF的内容,需要写成[^EF]

2、两大微观

第一条,单字符规则——单字符就是一次匹配一个字符‼️
正则表达式 简写 取反 表达意义
[012....789] \d \D 非数字 digit 数字,匹配所有数字
[a-zA-Z] \a \A alpha 匹配所有字母,不区分大小写
[a-zA-Z0-9_] \w \W word 匹配大小写字母、数字和下划线(也就是所有单词字符)
[ \t\r\n\v\f] \s \S space,匹配一些空白字符
[^\n] . 匹配\n以外的所有字符
特殊⚠️:

1、字符反斜杠\,如果要匹配\就得写成\\

"\\\\"这样的写法。 第一个反斜杠用于转义第二个反斜杠,表示一个反斜杠字符;第三个转义第四个。

2、换行符 \n

一般而言,正则都是逐行匹配的,一次匹配一行内容,不会遇到换行符,可以用[^\n]表示匹配所有字符,被简化成句点.,一个.可以匹配\n以外的所有字符。

第二条,多字符规则‼️‼️
正则表达 正则表达式简写 表达意义
{1,} + a+ 表示前面的匹配内容至少出现一次
{0,} * a* 表示前面的匹配的内容出现多次或者不出现 0次
{0,1} ab?只能匹配aab两种情况 表示前面的匹配的内容出现0次或者1次
.*? 一个匹配以后,不往下进行,具有最小匹配的性质。 表示匹配任意字符到下一个符合条件的字符
.* 具有贪婪的性质,匹配到不能匹配为止,a.*bc 可以匹配 abcbcbc 匹配任何字符0个或多个
这个不是所有的软件都支持的 ?跟在*后面 表示非贪婪模式,即为匹配最近字符

3、贪心匹配

正则表达式默认使用贪心模式,一次性匹配尽可能长的内容

这里?跟在*后面表示非贪心模式,找到一次之后不会再找

看了一篇讲的很通透的正则表达式,总算不用痛苦记忆了_第1张图片

4、括号()分组,通过分组的索引找到对应的值

看了一篇讲的很通透的正则表达式,总算不用痛苦记忆了_第2张图片

例如<(h1|p|artice|div)>.*?可以匹配h1particlediv四种闭合标签

4.1 java中的正则匹配器

matcher的group方法是Java中的一个字符串处理方法,用于从一个字符串中匹配出指定的子串。该方法可以根据传入的参数来返回不同的结果。

matcher.group()方法匹配出需要的内容。group()方法是针对()来说的, group(0)指的是整个正则表达式, group(1)指的是第一个括号里的东西

举例:

原始字符串"aaa2223bb"——正则表达式:([a-z]+)(\d+)——可以匹配到aaa2223

group  (0)    指的整个正则表达式匹配结果aaa2223

group(1) 指的是第一个括号里的东西,第一组匹配到的子字符串 aaa

group(2) 指的第二个括号里的东西,第二组匹配到的子字符串 2223

Pattern p = Pattern.compile("([a-z]+)(\\d+)");
Matcher m = p.matcher("aaa2223bb");
System.out.println(m.group(0));  // 返回 aaa2223
System.out.println(m.group(1)); // 返回aaa,返回第一组匹配到的子字符串
System.out.println(m.group(2)); // 返回2223,返回第二组匹配到的子字符串

5、引申——环视

规定当前字符右边为前(未处理),左边为后(已处理)

所有的环视都需要用括号括起来,以?开始,匹配之后继续向前(右)检查叫 前向环视

如果需要确保另一模式也匹配,叫肯定环视,用=,否则是否定环视,用!

匹配之后继续向后(左)检查叫 后向环视,为了跟前向有所区别,所以在?之后加了一个<,为大家指明方向,肯定和否标记则跟前向一样。

  • 前向肯定环视

    • 比如,字符串:foobarbarfoo ,匹配fooBARbarfoo, bar(?=bar)——括号里以?开头,=表示 检查是否出现

  • 前向否定环视

    • 匹配foobarBARfoobar,(?!bar),查到bar只后还要继续向前(右)看,没有bar才算匹配到

  • 后向肯定环视 (?<=foo)bar

    • 匹配 fooBARbarfoo,写成(?<=foo)bar,这是告诉正则引擎在找到bar之后还要回顾一下,需向后(左)确定有没有遇到foo,只有碰到才算匹配成功

  • 后向否定环视

    • 匹配foobarBARfoo, (?bar之后回顾一下,需向后(左)确定有没有遇到过foo,没有碰到才算匹配成功,

  • 应用:

  • 第一个,可以匹配单词的边界

    • \b匹配单词边界

    • 正则\bbar只会匹配字符串foo bar中的bar,而不会匹配foobar中的bar

  • 第二个,可以匹配一行的开始和结束

    • 开始:第一个字符之前的位置,在它之前没有字符,在它之后是任意字符 ——(?^

    • 结尾:(?<=.)(?!.)——简化:$

你可能感兴趣的:(正则表达式)