正则表达式的语法
如果要灵活运用正则表达式,必须了解各种元字符的功能,元字符从功能上大致分为:
- 元字符-转义符 \\
需要用到转义符号的字符有: . * + ( ) $ / \ ? [ ] ^ { }
- 限定符
符号 含义 示例 说明 匹配输入 * 指定字符重复0次或n次(零到多) (abc)* 仅包含任意个abc的字符串,等效与\w* abc、abcabc + 指定字符重复1次或n次(至少一次) m+(abc)* 以至少一个m开头,后接任意一个abc字符串 mabc、mmmabcabc ? 指定字符重复0次或1次(最多一次) m+abc? 以至少1个m开头,后接ab或abc的字符串 mab、mabc、mmmab、mmabc {n} 只能输入n个字符 [abcd]{3} 由abcd中的字母组成的任意长度为3的字符串 abc,dbc,adc {n,} 指定至少n个匹配 [abcd]{3,} 由abcd中的字母组成的任意长度不小于3的字符串 aab、dbc、aaadbc {n,m} 指定至少n个但不多于m个匹配 [abcd]{3,5} 由abcd中的字母组成的任意长度不小于3,不大于5的字符串 abc,dbc,adc - 选择匹配符
| 匹配 "|"之前或之后的表达式 ab|cd ab或cd
- 分组组合和反向引用符
符号 说明 pattern 非命名捕获。捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号 (?<name> pattern) 命名捕获。将匹配的字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含标点符号,并且不能以数字开头,可以使用单引号替代尖括号,例如(?<name>)(?'name') (?:pattern) 非捕获匹配,不存储供以后使用的匹配。匹配 pattern 但不捕获该匹配的子表达式,这对于用"or"字符()组合模式部件的情况很有用。例如,'industr(?∶ylies)是比'industry lindustries'更经济的表达式。 (?=pattern) 非捕获匹配。例如,"Windows(?=95198 NT 2000)'匹配 "Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。 (?!pattern) 非捕获匹配。该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。例如,'Windows(?!95198 NT 2000)'匹配"Windows 3.1"中的"Windows",但不匹配"Windows 2000"中的"Windows"。 - 特殊字符
- 字符匹配符
符号 符号 示例 解释 匹配输入 [] 可接收的字符列表 [name] n,a,m,e 中的任意字符 [^] 不接收的字符列表 [^abc] 除 a,b,c 以外的任意字符,包括特殊符号和数字 - 连字符 A-Z 任意单个大写字母 . 匹配除 \n 以外的任何字符 a..b 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串 aaab、aefb、a35b、a#*b \d 匹配单个数字字符,相当于[0-9] \d{3}(\d)? 包含3个或4个数字的字符串 123、9876 \D 匹配单个非数字字符,相当于[^0-9] \D(\d)* 以单个非数字字符开头,后接任意个数字字符 z、A345 \w 匹配单个数字,大小写字母字符,相当于[0-9a-zA-Z] \d{3}\w{4} 以3个数字字符开头的长度为7的数字字母字符串 234sdf8、4543dfd \W 匹配单个非数字,大小写字母字符,相当于[^0-9a-zA-Z] \W+\d{2} 以至少1个非数字字母字符开头,2个数字字符结尾的字符串 #29、%#¥78 ?! 不区分字母大小写 (?!)abc 表示不区分abc大小写 a(?!)bc、a((?!)b)c \s 匹配任何空白字符 \s 包括空格,回车 /r/n \S 匹配所有非空白字符 | \S 除空格以外的所有字符 4567890¥%……&*nameName - 定位符
符号 含义 示例 说明 匹配输入 ^ 指定起始字符 ^[0-9]+[a-z]* 以至少1个数字开头,后接任意个小写字母的字符串 123、6aa、555edf $ 指定结束字符 ^[0-9]+[a-z]+$ 以至少1个数字开头后接连字符"-",并以至少1个小写字母结尾的字符串 1-a \b 匹配目标字符串的边界 han\b 这里说的字符串边界指的是子串间有空格,或者是目标字符串的结束位置(边界是指:被匹配的字符串最后,也可以是空格的子字符串的后面) hanshunping、sphan、nnhan \B 匹配目标字符串的非边界 han\B 和\b的含义刚刚相反 hanshunping