正则表达式2
进行正则匹配时,尽量都加上 边界符 ^ 或者 \b
正则表达式元素可以归为三大类。
字符:字符可以代表一个单独的字符,或者一个字符集合构成的字符串。
限定符:允许你在模式中决定字符或者字符串出现的频率。
定位符:允许你决定模式是否是一个独立的单词,或者出现的位置必须在句子的开头还是结尾。
正则表达式代表的模式一般由四种不同类型的字符构成。
文字字符:像”abc”确切地匹配”abc“字符串
转义字符:一些特殊的字符例如反斜杠,中括号,小括号在正则表达式中居于特殊的意义,所以如果要专门识别这些特殊字符需要转义字符反斜杠。就像”\[abc\]“可以识别”[abc]“。
预定义字符:这类字符类似占位符可以识别某一类字符。例如”\d”可以识别0-9的数字。
自定义通配符:包含在中括号中的通配符。例如”[a-d]“识别a,b,c,d之间的任意字符,如果要排除这些字符,可以使用”[^a-d]“。
元素 | 描述 |
. | 匹配除了换行符意外的任意字符 |
[^abc] | 匹配除了包含在中括号的任意字符 |
[^a-z] | 匹配除了包含在中括号指定区间字符的任意字符 |
[abc] | 匹配括号中指定的任意一个字符 |
[a-z] | 匹配括号中指定的任意区间中的任意一个字符 |
\a | 响铃字符(ASCII 7) |
\c or \C | 匹配ASCII 中的控制字符,例如Ctrl+C |
\d | 匹配数字字符,等同于[0-9] |
\D | 匹配数字以外的字符 |
\e | Esc (ASCII 9) |
\f | 换页符(ASCII 15) |
\n | 换行符 |
\r | 回车符 |
\s | 白空格(空格,制表符,新行) |
\S | 匹配白空格(空格,制表符,新行)意外的字符 |
\t | 制表符 |
\uFFFF | 匹配Unicode字符的十六进制代码FFFF。例如,欧元符号的代码20AC |
\v | 匹配纵向制表符(ASCII 11) |
\w | 匹配字符,数字和下划线 |
\W | 匹配匹配字符,数字和下划线以外的字符 |
\xnn | 匹配特殊字符,nn代表十六进制的ASCII 码 |
.* | 匹配任意数量的字符(包括0个字符) |
限定符
上面表格中列出的每个通配符,可以代表一个确定的字符。使用限定符,可以精确地确定字符的出现频率。例如”\d{1,3}”代表一个数字字符出现1到3次。
元素 | 描述 |
* | 匹配一个元素0次或者多次(最大限度地匹配) |
*? | 匹配前面的元素零次或者多次(最小限度地匹配) |
.* | 匹配任意个数的任意字符(包括0个字符) |
? | 匹配上一个元素0次或者1次(最大限度地匹配) |
?? | 匹配上一个元素0次或者1次(最小限度地匹配) |
{n,} | 匹配上一个元素至少n次 |
{n,m} | 匹配上一个元素n至m次 |
{n} | 匹配上一个元素n次 |
+ | 匹配上一个元素一次或者多次 |
- *? 重复任意次,但尽可能少重复
- +? 重复1次或更多次,但尽可能少重复
- ?? 重复0次或1次,但尽可能少重复
- {n,m}? 重复n到m次,但尽可能少重复
- {n,}? 重复n次以上,但尽可能少重复
- | 表示 or
"colour"
-match
"colou?r"
"color"
-match
"colou?r" 均返回true
此处的字符“?”并不代表任何字符,因为怕你可能会联想到简单模式匹配里面的“?”。正则表达式中的“?”,只是一个限定符,它代表的是指定字符或者子表达式出现的频率。具体到上面的例子,“u?”就确保了字符“u”在模式中不是必需的。常用的其它限定符,还有“*”(出现0次后者多次)和“+”(至少出现一次)
类似IP地址的模式通过正则表达式来描述比简单的通配符字符会更加精确。通常会使用字符和量词结合,来指定某个具体的字符应当出现,以及出现的频率:
元素 | 描述 |
$ | 在字符串的结尾匹配 |
\A | 在字符串的开始匹配(包含多行文本) |
\b | 在单词的边界匹配 |
\B | 不在单词的边界匹配 |
\Z | 在字符串的结尾匹配(包含多行文本) |
^ | 在字符串的开始匹配 |
1
2
3
4
5
6
7
8
9
10
|
$parttern = "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" "192.168.10.3" -match $parttern "a.168.10.3" -match $parttern "1000.168.10.3" -match $parttern <# #输出 #True #False #False #> |
这里模式被描述成4个类似的数字,每个数字以圆句句号分割,每个数字的位数介于1-3。另外在开始和结尾可以包含空格。当这些数字处于0到255之间时,IP的验证还是挺完美的。
但是当某个数字超过255时,则显得无能为力。
1
2
3
4
5
6
|
$parttern = "\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b" "255.489.921.321" -match $parttern <# #输出: #True #> |
验证IP:((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))
验证Email格式
如果你想验证用户提供的E-Mail地址是不是一个合法电子邮件格式,可以使用下面的正则表达式:
1
2
3
4
5
6
7
8
|
$parttern = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b" "mosser@pstips.net" -match $parttern ".@ ." -match $parttern <# #输出: #True #False #> |
无论什么时候,希望一个表达式以一个单独的“单词”在文本中出现,可以使用分隔符:单词边界(定位符”\b”),这样正则表达式就会知道你感兴趣的是字符串中除去那些白空格(像空格,制表符,换行符)以外的字符。
紧随其后的正则表达式指定的是那些字符可以被允许出现在电子邮件地址中。被允许的字符放在方括号中,由字符区间(例如:A-Z0-9″)和单个字符(例如:”._%+-”)构成。“+”放在方括号后面是一个限定符,意味着前面的字符至少出现一次。当然你可以规定出现更多的字符。
接下来的是“@”,@之后的字符可以和@前面的一样。在电子邮件地址后面必须出现一个圆句点。但是因为圆句点属于特殊字符,所以加了反斜杠转义,让它以普通字符的形式出现在正则表达式中。
在圆句点之后是域标识,它们完成由字母([A-Z])组成,限定符({2,4})紧随其后指定域标识符应当至少由2个字符,至多由4个字符组成。
但是上面的正则表达式仍旧有一些瑕疵:
1
2
3
4
5
6
7
8
9
|
$parttern = "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$" "请邮件联系: mosser@pstips.net 好不好?" -match $parttern "mosser@pstips.net" -match $parttern <# #输出: #False #True #> |
原始英文链接:http://powershell.com/cs/blogs/ebookv2/archive/2012/03/20/chapter-13-text-and-regular-expressions.aspx
##########################################################################################
一 单个字符
“正则表达式”描述在搜索文本正文时要匹配的一个或多个字符串。 该表达式可用作一个将字符模式与要搜索的字符串相匹配的模板。
正则表达式包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。
特殊字符
下表包含了单字符元字符的列表以及它们在正则表达式中的行为。
若要匹配这些特殊字符之一,必须首先转义字符,即,在字符前面加反斜杠字符 (\)。 例如,若要搜索“+”文本字符,可使用表达式“\+”。
*
零次或多次匹配前面的字符或子表达式。
等效于 {0,}。
zo* 与“z”和“zoo”匹配。
+
一次或多次匹配前面的字符或子表达式。
等效于 {1,}。
zo+ 与“zo”和“zoo”匹配,但与“z”不匹配。
?
零次或一次匹配前面的字符或子表达式。
等效于 {0,1}。
当 ? 紧随任何其他限定符(*、+、?、{n}、{n,} 或 {n,m})之后时,匹配模式是非贪婪的。 非贪婪模式匹配搜索到的、尽可能少的字符串, 而默认的贪婪模式匹配搜索到的、尽可能多的字符串。
zo? 与“z”和“zo”匹配,但与“zoo”不匹配。
o+? 只与“oooo”中的单个“o”匹配,而 o+ 与所有“o”匹配。
do(es)? 与“do”或“does”中的“do”匹配。
^
匹配搜索字符串开始的位置。 如果标志中包括 m(多行搜索)字符,^ 还将匹配 \n 或 \r 后面的位置。
如果将 ^ 用作括号表达式中的第一个字符,则会对字符集求反。
^\d{3} 与搜索字符串开始处的 3 个数字匹配。
[^abc] 与除 a、b 和 c 以外的任何字符匹配。
$
匹配搜索字符串结尾的位置。 如果标志中包括 m(多行搜索)字符,^ 还将匹配 \n 或 \r 前面的位置。
\d{3}$ 与搜索字符串结尾处的 3 个数字匹配。
.
匹配除换行符 \n 之外的任何单个字符。 若要匹配包括 \n 在内的任意字符,请使用诸如 [\s\S] 之类的模式。
a.c 与“abc”、“a1c”和“a-c”匹配。
[]
标记括号表达式的开始和结尾。
[1-4] 与“1”、“2”、“3”或“4”匹配。 [^aAeEiIoOuU] 与任何非元音字符匹配。
{}
标记限定符表达式的开始和结尾。
a{2,3} 与“aa”和“aaa”匹配。
()
标记子表达式的开始和结尾。 可以保存子表达式以备将来之用。
A(\d) 与“A0”至“A9”匹配。 保存该数字以备将来之用。
|
指示在两个或多个项之间进行选择。
z|food 与“z”或“food”匹配。 (z|f)ood 与“zood”或“food”匹配。
/
表示 JScript 中的文本正则表达式模式的开始或结尾。 在第二个“/”后添加单字符标志可以指定搜索行为。
/abc/gi 是与“abc”匹配的 JScript 文本正则表达式。 g(全局)标志指定查找模式的所有匹配项,i(忽略大小写)标志使搜索不区分大小写。
\
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。
\n 与换行符匹配。 \( 与“(”匹配。 \\ 与“\”匹配。
摘自:http://hi.baidu.com/wqaz396056737/item/5e01d43bc1ab83f696f88d28