正则表达式说白了就是一堆约定俗成的匹配规则。如果从微观入手,你会发现有背不完的规则;如果从宏观入手,你会发现万变不离其宗。所以我们将从宏观到微观依次说起,依次为大家总结三大宏观规则、两大微观规则,再附带一部分高级内容。基本可以通过一篇文章让大家理解正则表达式的主要用法。------来源:正则表达式入门
强烈推荐有需要的大家先看看上面这篇
以下是笔者学习后总结整理方便记忆
EF
一个正则,表示同时匹配E
和F
的内容
E|F也是一个正则,表示匹配
E或者匹配
F,[EFGH]
跟写成E|F|G|H
效果是一样
要排除匹配E
和F
的内容,需要写成[^EF]
正则表达式 | 简写 | 取反 | 表达意义 |
---|---|---|---|
[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?只能匹配 a和 ab两种情况 |
表示前面的匹配的内容出现0次或者1次 |
.*? | 一个匹配以后,不往下进行,具有最小匹配的性质。 | 表示匹配任意字符到下一个符合条件的字符 |
.* | 具有贪婪的性质,匹配到不能匹配为止,a.*bc 可以匹配 abcbcbc |
匹配任何字符0个或多个 |
? | 这个不是所有的软件都支持的 | ?跟在*后面 表示非贪婪模式,即为匹配最近字符 |
正则表达式默认使用贪心模式,一次性匹配尽可能长的内容
这里?
跟在*
后面表示非贪心模式,找到一次之后不会再找
例如<(h1|p|artice|div)>.*?\1>
可以匹配h1
、p
、article
和div
四种闭合标签
matcher的group方法是Java中的一个字符串处理方法,用于从一个字符串中匹配出指定的子串。该方法可以根据传入的参数来返回不同的结果。
matcher.group()方法匹配出需要的内容。group()方法是针对()来说的, group(0)指的是整个正则表达式, group(1)指的是第一个括号里的东西
举例:
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,返回第二组匹配到的子字符串
规定当前字符右边为前(未处理),左边为后(已处理)
所有的环视都需要用括号括起来,以?
开始,匹配之后继续向前(右)检查叫 前向环视,
如果需要确保另一模式也匹配,叫肯定环视,用=,否则是否定环视,用!
;
匹配之后继续向后(左)检查叫 后向环视,为了跟前向有所区别,所以在?
之后加了一个<
,为大家指明方向,肯定和否标记则跟前向一样。
前向肯定环视
比如,字符串: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
。
第二个,可以匹配一行的开始和结束
开始:第一个字符之前的位置,在它之前没有字符,在它之后是任意字符 ——(?^
结尾:(?<=.)(?!.)——简化:$