正则表达式 简介及语法

Linux 正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

正则表达式的使用,可以通过简单的办法来实现强大的功能。下面先给出一个简单的示例:

^[0-9]+abc$

^:为匹配输入字符串的开始位置。
[0-9]+:匹配多个数字;[0-9]匹配单个数字,+ 匹配一个或者多个。
abc$:匹配字母abc并以abc结尾,$ 为匹配输入字符串的结束位置。

^[a-z0-9_-]{3,15}$

^:为匹配输入字符串的开始位置。
a-z:字母a-z
0-9:数字0-9
_:连字符
{3,15}:3到15个字符的长度
$:为匹配输入字符串的结束位置

正则表达式语法:
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

hank+y: 可以匹配hanky、hankky、hankkkkky等,+ 号代表前面的字符串必须至少出现一次。(一次或者多次)

hankk*y:可以匹配hanky、hankky、hankkkkkkky等,*  号代表前面的字符串可以不出现,也可以出现一次或者多次。(0次,一次或者多次)

colou?r:可以匹配color或colour,?号代表前面的字符串最多只出现一次。(0次或者1次)

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

普通字符:

[ABC]: 匹配[]中的ABC字符串
[^ABC]:匹配除了ABC字符串外的所有字符串
[A-Z]: 匹配所有大写字母
[a-z]: 匹配所有小写字母
. :    匹配除换行符(
、
)之外的任何单个字符,相等于(^

)
[sS]:匹配所有。s 是匹配所有空白符,包括换行; S 非空白符,包括换行。
w:    匹配字符、数字、下划线。等价于 [A-Za-z0-9_]

非打印字符:

cx:匹配由x指明的控制字符。例如, cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。
f:匹配一个换页符。等价于 x0c 和 cL。

:匹配一个换行符。等价于 x0a 和 cJ。

:匹配一个回车符。等价于 x0d 和 cM。
s:匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ f

	v]。注意 Unicode 正则表达式会匹配全角空格符。
S:匹配任何非空白字符。等价于 [^ f

	v]。
	:匹配一个制表符。等价于 x09 和 cI。
v:匹配一个垂直制表符。等价于 x0b 和 cK。

特殊字符:
所谓特殊字符,就是一些有特殊含义的字符,如上面说的 hank*y 中的 *,简单的说就是表示任何字符串的意思。如果要查找字符串中的 * 符号,则需要对 * 进行转义,即在其前加一个 : hank*y 匹配 hank*y。

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 放在它们前面。下表列出了正则表达式中的特殊字符:

$:匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '
''
'。要匹配 $ 字符本身,请使用 $。
():标记一个子表达式的开始和结束位置。子表达式获取后供以后使用。要匹配这些字符,请使用()
*:匹配前面的表达式0次或者多次。要匹配 * 字符,请使用 *
+:匹配前面的表达式一次或者多次。要匹配 + 字符,请使用 +
.:匹配除换行符 
 外的任何单字符。要匹配 . ,请使用 .
[:标记一个中括号表达式的开始。要匹配 [,请使用 [
?:匹配前面的表达式0次或者一次,或指明一个非贪婪限定符。要匹配 ? ,请使用 ?
:将下一个字符标记或者特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n''
' 匹配换行符。序列 '\' 匹配 "",而 '(' 则匹配 "("
^:匹配输入字符串的开始位置
[^]:匹配除方括号内的字符集合
{:标记限定符表达式的开始。要匹配 {,请使用 {。
|:指明两项之间的一个选择。要匹配 |,请使用 ||:或  在扩展正则中,可以去掉  例:grep "^(a|b).*" /etc/passwd    a或者b开头的;grep -Ew "^(root|lix|zhwt)" /etc/passwd;grep -E "^(root|lix|zhwt)>" /etc/passwd
<:词首
>:词尾
<>:首尾
^$:空行   空行,例:grep -v "^$" ;过滤空行,例:grep -v "^[[:space:]]*$"

限定符:限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。

*:匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。
+:匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
?:匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do""does" 中的 "does""doxy" 中的 "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?'。请注意在逗号和两个数之间不能有空格。

* 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配。

定位符:

^:匹配输入字符串开始的位置。
$:匹配输入字符串结尾的位置。
:匹配一个单词边界,即字与空格间的位置。
B:非单词边界匹配。

注意:不能将限定符与定位符一起使用。

以下列出 ?=、?<=、?!、?<! 的使用区别:

1. exp1(?=exp2):查找 exp2 前面的 exp1
2. (?<=exp2)exp1:查找 exp2 后面的 exp1
3. exp1(?!exp2):查找后面不是 exp2 的 exp1
4. (?<!exp2)exp1:查找前面不是 exp2 的 exp1
原文地址:https://www.cnblogs.com/hankyoon/p/13884466.html