简述
正则表达式(regular expression):描述可能出现在用户提交的文本中的一小段代码,我们通过它,将出现的代码块替换为特殊格式。
正则表达式广泛好用,但入门困难。
语法规范
分隔符
目标代码块被分隔符包围,分隔符一般选用斜杠(/)或井号(#),也可以用除字母、数字和反斜杠之外的任何字符作为分隔符。反斜杠可以转义,转义在基础级文章略有提及,此处不赘述。
模式修饰符
默认情况下,正则表达式区分大小写,不过我们可以通过模式修饰符(pattern modified),使正则忽略大小写。
模式修饰符是一个单个的字符标志,跟在表达式的结束分隔符后。
符号 | 注释 |
---|---|
i | 匹配时,不区分大小写 |
特殊字符
符号- | 中文名—- | 注释 |
---|---|---|
^ | 脱字字符 | 匹配字符串的开始,自身不包含任何字符,只考虑字符位置 |
$ | 美元符号 | 匹配字符串的结尾,同上 |
. | 点号 | 通配符,匹配任何单个字符,除了换行(\n) |
* | 星号 | 要求前面的字符出现0或多次,具有贪婪属性1 |
+ | 加号 | 要求前面的字符出现1或多次,具有贪婪属性 |
? | 问号 | 匹配前面的子表达式0次或1次,在* 或+ 的后面加上一个? 就可以实现非贪婪(最小匹配,minimal match) |
| | 管道符号 | 正则匹配管道左或右边的模式 |
(…) | 圆括号 | 标记一个子表达式的开始和结束位置。可对其应用一个修饰符,至于结束括号后即可 |
[…] | 方括号 | 定义字符类(character class),匹配方括号列出的字符之一。在前方括号后加入^,即可匹配 除去方括号包含的字符 |
转义序列
(escape sequences)
意义:匹配不太容易输入的一个字符,或匹配某种类型的一个字符。
符号 | 注释 |
---|---|
\n | 换行字符 |
\r | 回车字符 |
\t | 制表符 |
\s | 空白字符(whitespace character),等同[\n\r\t] |
\S | 非空白字符,等同[^\n\r\t] |
\d | 数字,等同[0-9] |
\D | 非数字,等同[^0-9] |
\w | 单词字符,等同[a-zA-Z0-9_] |
\W | 非单词字符,等同[^a-zA-Z0-9_] |
\b | 表示单词边界(起始/结束) |
\B | 表示非单词边界(非起始/结束) |
PHP中的正则函数
preg_match:
用来确认一个特定的字符串,是否匹配一个正则表达式。
preg_replace:
接受一个正则表达式和一个文本字符串,并尝试在字符串中匹配该正则表达式。还接受另一个文本字符串,并用该字符串来替换每一次正则匹配。
preg_replace (regExp, replaceWith, OldString [, $limit = -1(无穷) [, int &$count ]] )
例子:
$test = preg_replace('/_([^_]+)_/', '<em>$1</em>');
// 每一个圆括号内,都包含了一个块内容,而块内容的名称按$1、$2……依次递增,在JScript 中则使用 $0…$9 属性。
str_replace:
搜索字符串而非正则表达式模式,类似preg_replace函数,但比之更为高效,对于不区别大小写的简单替换,可以用它来代替。
结语
正则表达式并没有那么容易,但无论如何,既然从事这个职业,既然爱上了编程和编程所涉及的部分方面,我们就应该去尽力做好,将正则写的优雅而易读,这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易被理解。
By the way,匹配中文字符的正则表达式: [\u4e00-\u9fa5]。
参考资料:1
《PHP&MySQL Novice to Ninja》(Kevin Yank [澳])
正则表达式 - 菜鸟教程
preg-replace - 官方手册
- 匹配时,
*
或+
会很贪婪(greedy)的包含尽可能多的字符。 ↩