正则表达式(regular expression)

概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑

为什么使用正则表达式?

典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。

  • 通过使用正则表达式,可以:

  测试字符串内的模式。例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。

  替换文本。可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。

  基于模式匹配从字符串中提取子字符串。可以查找文档内或输入域内特定的文本。

语法

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

匹配规则示例

^once:这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。
bucket$:这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。
^bucket$:只匹配字符串"bucket"。
once:与任何包含该模式的字符串匹配。
[a-z] :匹配所有的小写字母 
[A-Z] :匹配所有的大写字母 
[a-zA-Z]:匹配所有的字母 
[0-9]:匹配所有的数字 
[0-9\.\-]:匹配所有的数字,句号和减号 
[ \f\r\t\n]:匹配所有的白字符
^[a-z][0-9]$:匹配一个由一个小写字母和一位数字组成的字符串,比如"z2""t6""g7",但不是"ab2""r2d3""b52"
^[^0-9][0-9]$:前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示"""排除"的意思,常常用来剔除某个字符。前面的例子要求第一个字符不能是数字
^[a-zA-Z_]$     所有的字母和下划线
^[[:alpha:]]{3}$     所有的3个字母的单词
^a$     字母a
^a{4}$     aaaa
^a{2,4}$     aa,aaa或aaaa
^a{1,3}$     a,aa或aaa
^a{2,}$     包含多于两个a的字符串
^a{2,}     如:aardvark和aaab,但apple不行
a{2,}     如:baad和aaa,但Nantucket不行
\t{2}     两个制表符
.{2}     所有的两个字符
^[a-zA-Z0-9_]{1,}$ //所有包含一个以上的字母、数字或下划线的字符串 
^[0-9]{1,}$ //所有的正数 
^\-{0,1}[0-9]{1,}$ //所有的整数 
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数
^\-?[0-9]{0,}\.?[0-9]{0,}$:特殊字符"?"与{0,1}是相等的,它们都代表着:"0个或1个前面的内容""前面的内容是可选的"
^[a-zA-Z0-9_]+$ //所有包含一个以上的字母、数字或下划线的字符串 
^[0-9]+$ //所有的正数 
^\-?[0-9]+$ //所有的整数 
^\-?[0-9]*\.?[0-9]*$ //所有的小数

正则表达式示例

/a/
/7/
/M/
/a7M/
/a.c/:句点 (.) 匹配字符串中的各种打印或非打印字符,只有一个字符例外。这个例外就是换行符 (\n)。前面的正则表达式匹配 aac、abc、acc、adc 等等,以及 a1c、a2c、a-c 和 a#c
/Chapter [12345]/或/Chapter [1-5]/:中括号表达式,括在中括号表达式中的字符只匹配处于正则表达式中该位置的单个字符。正则表达式匹配 Chapter 1、Chapter 2、Chapter 3、Chapter 4 和 Chapter 5
/Chapter [^12345]/或/Chapter [^1-5]/:若要查找不在列表或范围内的所有字符,请将插入符号 (^) 放在列表的开头。如果插入字符出现在列表中的其他任何位置,则它匹配其本身。前面的示例中,表达式在第九个位置匹配 12345 之外的任何数字和字符。这样,例如,Chapter 7 就是一个匹配项,Chapter 9 也是一个匹配项。

/^Chapter|Section [1-9][0-9]{0,1}$/:上面的正则表达式要么匹配行首的单词 Chapter,要么匹配行尾的单词 Section 及跟在其后的任何数字。如果输入字符串是 Chapter 22,那么上面的表达式只匹配单词 Chapter。如果输入字符串是 Section 22,那么该表达式匹配 Section 22/^(Chapter|Section) [1-9][0-9]{0,1}$/:表达式匹配出现在行首和行尾、后面跟一个或两个数字的 Chapter 或 Section。
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/:防止匹配被保存。除 ?: 元字符外,两个其他非捕获元字符创建被称为"预测先行"匹配的某些内容。正向预测先行使用 ?= 指定,它匹配处于括号中匹配正则表达式模式的起始点的搜索字符串。反向预测先行使用 ?! 指定,它匹配处于与正则表达式模式不匹配的字符串的起始点的搜索字符串。

/\b([a-z]+) \1\b/gi 一个单词连续出现的位置。 /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 将一个URL解析为协议、域、端口及相对路径。 /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置。 /[-a-z]/ :A至z共26个字母再加一个-号。 /ter\b/:可匹配chapter,而不能匹配terminal。 /\Bapt/:可匹配chapter,而不能匹配aptitude。 /Windows(?=95 |98 |NT )/ :可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次的检索匹配。 /^\s*$/ :匹配空行。 /\d{2}-\d{5}/:验证由两位数字、一个连字符再加 5 位数字组成的 ID 号。 /<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ :匹配 HTML 标记。

 

posted @ 2015-01-27 11:37  学而~  阅读(373)  评论(0编辑  收藏  举报