字符类
要查找数字、字母或者空白,这些也是很简单的,因为已经有了对应这些字符集的特殊代码。
例如如果你想查找元音(a,e,I,o,u),那么你可以这样说[aeiou],这就可以匹配任何一个元音字母,[,.!?]这就可以匹配这四个字符。当我们在中括号中这样输入时不会被匹配成其他的意义。
同理,[0-9]的意义与\d的含义是一样的,[a-z0-9A-Z]与\w也是一样的。
列一个相对比较复杂的表达式:\(?0)d{2}[) -]?\d{8}。
这个表达式匹配的是几种格式的电话号码(010)88888888或者023-88888888或02088888888等。分析:首先一个转义字符\(,?是0次或者1次,然后是一个0,接着{2}是出现两个数字,后面是)或-或空格其中的一个,?是出现1次或者不出现,最后八个数字\d{8}。但是这个式子也是可以匹配020)88888888或者(02088888888这样不正确的格式。所以要解决这样的问题就要看下面的内容。
反义
又是需要查找不属于某个简单定义的字符类型的字符。比如想查找除了数字以外,其他任意字符都行的情况,只是需要用到反义。
常用的反义代码
代码/语法 |
说明 |
\D |
匹配任意非数字的字符 |
\B |
匹配不是单词开头或结束的位置 |
[^aeiou] |
匹配除了aeiou这几个字母以外的任意字符 |
\W |
匹配任意不是字母和数字的字符 |
\S |
匹配任意不是空白符的字符 |
[^x] |
匹配除了x以外的任意字符 |
栗子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串
替换
正则表达式里的替换值得是有几种规则,如果满足其中一种规则都应该当成匹配,具体方法是用|把不同的规则分开。下面用栗子来进行说明。
(\d{1,3}\.){3}\d{1,3}是一个简单的IP地址匹配表达式。分析:\d{1,3}代表1到3的数字,(\d{1,3}\.){3}代表三位数加上一个英文句号(次整体)重复三次,最后再加上一个三位数\d{1,3}。
但是这个表达式出现的问题是他可以匹配得到256.333.999.999这种可能的IP地址。因为正则表达式不提供关于数学的任何功能,所以只能使用冗长的分组来进行表达正确的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
后向引用
使用小括号制定一个子表达式后,匹配这个表达式的文本可以在正则表达式或其他程序中作进一步的处理。默认情况下魅族会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为1,第二个为2,以此类推。
后向引用用来重复搜索前面某个分组匹配的文本。
\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go,fire fire。首先是一个单词\b(\w+)\b,然后是一个或者几个空白符\s+,最后是前面匹配的那个单词\1。
你也可以自己指定子表达式的组号或组名。要指定一个子表达式的组名,请使用这样的语法:(?<Word>\w+),这样就把\w+的组名指定为Word了。要反向引用这个分组捕获的内容,你可以使用\k<Word>,所以上一个例子也可以写成这样:\b(?<Word>\w+)\b\s*\k<Word>\b。
捕获 |
|
(exp) |
匹配exp,并捕获文本到自动命名的组里 |
(?<name>exp) |
匹配exp,并捕获文本到名称为name的组里 |
(?:exp) |
匹配exp,不捕获匹配的文本 |
位置指定 |
|
(?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp后面的位置 |
(?!exp) |
匹配后面跟的不是exp的位置 |
(?<!exp) |
匹配前面不是exp的位置 |
注释 |
|
(?#comment) |
这种类型的组不对正则表达式的处理产生任何影响,只是为了提供让人阅读注释 |
评论