正则表达式使用详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meteorsshower2013/article/details/82685529

一、正则表达式概念

二、正则表达式用途

三、正则表达式使用

(一)语法

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。

这里的特殊字符(元字符)我们可以理解为某种语言的关键字或保留字,,因为有特殊用途表示特殊含义。

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。

1、普通字符

除去特殊字符,剩下的都是普通字符。
普通字符可以分为打印字符非打印字符。二者区别可以理解为打印在纸上会不会有痕迹。
普通字符有:大写字母,小写字母,数字,标点,其他。

2、非打印字符

非打印字符是普通字符的一种。
这里举例:
1.

\cx

匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control+M 或回车符。x 的值必须为 A-Z 或 a-z之一。

什么是控制字符:

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。
标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。
其中:

0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),
如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

32~126(共95个)是字符(32是空格),
65~90为26个大写英文字母,
97~122号为26个小写英文字母,
其余为一些标点符号、运算符号等。

基于ASCII的键盘上有个标为“Control”或”Ctrl”(有时也作”Cntl”)的键,其用法非常类似于换档键,即与其他字母或符号键一起按下。通过这种方式使用控制键,会把按下的字符键的ASCII编码字节的7位中左起的两个字元强制定为0;从而产生出32个ASCII控制码之一。例如,按下CTRL和字母G(十进制编码为71,二进制为01000111),产生编码7(振铃符,十进制编码7,或二进制00000111)。

2.

\f

匹配一个换页符。等价于 \x0c 和 \cL。
3.

\n

匹配一个换行符。等价于 \x0a 和 \cJ。
4.

\r

匹配一个回车符。等价于 \x0d 和 \cM。
5.

\t

匹配一个制表符。等价于 \x09 和 \cI。
6.

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK。
7.

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
8.

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

3、特殊字符(即正则中的关键字)

特殊字符也叫做元字符,保留字符(Metacharactor),在 正则 中表示特殊的意义。
特殊字符共有 11 个:

$

匹配输入字符串的结尾位置。要匹配 $ 字符本身,请使用 \$。

.

匹配除换行符 \n 之外的任何单字符。要匹配 .,请使用 \。

^

匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。

—————————————————————————————————————————————————

()

标记一个子表达式的开始和结束位置。要匹配这些字符,请使用 \( 和 \)。

[]

标记一个中括号表达式的开始。要匹配 [,请使用 \[。

注意:()和[]有本质的区别
()内的内容表示的是一个表达式,代表的是子表达式。
[]表示匹配字符在[]中,并且出现一次,代表的是一个字符。

—————————————————————————————————————————————————

*

匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。

+

匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。

?

匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。

{

标记限定符表达式的开始。要匹配 {,请使用 \{。

—————————————————————————————————————————————————

\

将下一个字符标记为或特殊字符、或原义字符、或反向引用、或八进制转义符。例如, 'n' 匹配字符 'n'。 '\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。

|

指明两项之间的一个选择。要匹配 |,请使用 |。

在元字符前加 \ 转义符,可以把特殊字符当作普通字符来使用。

比如:如要要匹配 1+1=2 ,正确的正则表达式应该为 1+1=2。否则, + 会被当作特殊字符对待。

除了特殊字符,所有的其他字符都不应该加 \ 。
因为 \ 也是一个特殊字符。 \ 和普通字符组合在一起也可以创造一种特殊的意义。
比如 \d 表示匹配所有的数字

4、字符集

字符集描述了一组字符, 正则解释器会认为匹配字符集中的一个字符就可以认为匹配成功。
字符集用[ ]括起来即可。
比如 gr[ae]y 就可以匹配 gray 或者 grey。
字符集只能匹配一个字符, gr[ae]y 就不能和 graey 匹配。字符集中的字符顺序是任意的,得到的结果都是唯一的。

可以在字符集中用连字符”-”来表示一个范围。 [0-9]的结果和[0123456789]的匹配结果都是相同的。
字符集中的范围可以有多种。比如[0-9a-fA-F]表示匹配所有的 16 进制,包括大小写。
也可以把范围和单个字符组合在一起用,[0-9a-fxA-FX]表示匹配所有的 16 进制或者一个字符 X。
字符集的顺序不会影响结果。
在字符集的开始标志”[“后面加上一个”^”符号,表示否定,表示匹配除字符集中定义的字符以外的所有字符。包括非打印字符和行结束符。
注意:字符集匹配的一个字符,而不是一个位置。所以。 q[^u]的意义不是”q 后面的字符不是u”。而是”q 后面的字符可以是除了 u 以外的所有字符”。
q[^u]不会和 Iraq 匹配。
但是会和 Iraq is a country 匹配,因为 q 后面的空格字符是一个”不是 u 的字符”。

5、字符集中使用特殊字符

字符集中的元字符只能是 ‘]’, ‘\’, ‘^’, 和 ‘-’ 。
其他元字符在字符集中都失去了特殊意义,表示的只是一个普通字符。也不需要用加”\”。
比如:
匹配一个”*”或者”+”,用[*+]就足够了。即使给他们加上”\”, regex 解释器也会把他们忽略掉。
四种特殊字符的处理:
在字符集中要表示”]”, ”^”和”-”需要在后面加上转义符”\”,来表示它们代表的分别是普通字符”]”, ”^”和”-”。
也可以把它们放在一个不能表示特殊意义的位置,
后一个方法比较好,因为他们不会影响可读性。

“^”
要想匹配一个”^”,可以把它放在除了紧跟”[“的任意一个位置。

[x^]
匹配 x 或者”^”
“]”
可以把”]”放在紧跟着”[“的位置,或者使用否定字符集。

[]x]
匹配 x 或者”]”

[^]x]
匹配除了 x 和”] “以外的所有字符
\”
要想把”\”当作一个普通字符来匹配,而不是一个特殊字符,必须把”\”再用一个”\”括起来。

[\\x]
匹配 x 或者”\”
-”
连字符可以放在紧跟着”[“的后面,或者正好”]”的前面,或者紧跟着”^”的后面。

[-x]
匹配 x 或者”-[x-]
匹配 x 或者”-

预定义字符集
因为很多字符集是经常使用的,所以 Regex 解释器预定义了一些常用字符集:

d
[0-9]
所有数字
\w
[a-zA-Z]
表示所有的字符,和文化字体有关
\s
[ \t\r\n]
空格,回车和 tab。和文化字体有关
预订一字符集可以既可以用在字符集里面,也可以用在字符集外面。
\s\d
1<space>+<space>2<space>=<space>3
匹配后面紧跟着一个数字的空白符
[\s\d]
1<space>+<space>2<space>=<space>3
匹配一个单独的字符或者一个数字或者一个空白符
[\da-fA-F]和[0-9a-fA-F]的匹配结果是一样的。

同样,在预定义字符集前面加一个”^”符号表示否定。它们也有预先定义好的表示:

\D [^\d] 非数字
\W
[^\w]
非字符,和文化字体有关
\S
[^\s]
非空格,回车和 tab。和文化字体有关

在”[]”使用否定预订一字符集时要特别心。 [\D\S]不等于[^\d\s]。
[^\d\s]会匹配除了数字和空白符以外的所有字符。
而[\D\S]会匹配要么不是一个数字,要么是空白符。
因为数字不是空白符,空白符也不是数字,所以[\D\S]会匹配任意的字符。

6、限定符

限定符可以指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
下表给出了各种限定符及其含义的说明:

* 匹配前面的子表达式零次或多次。例如, zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}
+ 匹配前面的子表达式一次或多次。例如, 'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}
? 匹配前面的子表达式零次或一次。例如, "do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。 ?等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如, 'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。
{n,} n 是一个非负整数。至少匹配 n 次。例如, 'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配"foooood" 中的所有 o。 'o{1,}' 等价于 'o+''o{0,}' 则等价于 'o*'
{n,m} m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。
 "o{1,3}"将匹配 "fooooood" 中的前三个 o。 'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

‘*’、 ‘+’和 ‘?’ 限定符都称之为贪婪的,也就是说,他们尽可能多地匹配文字。
有时这根本就不是所希望发生的情况。有时则正好希望最小匹配。
通过在 ‘*’、 ‘+’ 或 ‘?’ 限定符后放置 ‘?’,该表达式就从贪婪匹配转为了非贪婪或最小匹配。

高级:贪婪匹配和非贪婪匹配

猜你喜欢

转载自blog.csdn.net/meteorsshower2013/article/details/82685529