选择
正则表达式,除了能用字符集进行当个字符的选择,还能通过选择符`|`对表达式进行选择。
例如要在字符串里面匹配两个单词“cat”和“dog”,可以使用表达式:
`cat|dog`
先用正则表达式`cat`匹配,如果匹配不上,再用正则表达式`dog`进行匹配。
优先级
选择符`|`相比于其他正则式符号优先级是比较低的。如,正则表达式:
`\b[Cc]at\b|\b[Dd]og\b`
选择符`|`将正则表达式分成了两个部分,左边为`\b[Cc]at\b`和右边为`\b[Dd]og\b`。先匹配左边正则表达式,然后再匹配右边的正则表达式。当然,也可以将选择符的结果当成子表达式使用。如,上面的表达式可以改成:
`\b([Cc]at|[Dd]og)\b`
`()`可以将选择结果当子表达式使用。上述表达式先匹配`\b`,然后匹配`[Cc]at|[Dd]og`,最后匹配`\b`。
最左匹配
正则表达式从左到右进行匹配,最先匹配到的则被认为是表达式的结果。在匹配字符串“2016”,如果用正则表达式:
`20|2016`
从左到右,先用`20`匹配字符串,返回的结果是“20”而非我们期待的“2016”。对这种情况,我们可以将正则表达式改一下,如下:
`2016|20`
这样可以保证,表达式`2016`先于`20`执行。另外,我们也可以通过选择符号`?`,将正则表达式改成如下:
`20(16)?`
这样也能达到我们的目的。
重复
对于字符串的查找,有时候我们并不确定我们需要查找的字符串的长度。比如,查找字符串里面的数字,数字可能由一个或多个数字字符组成,可能是“1”、“123”或“12345”等待。或者查找一个单词,单词由一个或多个单词字符组成,可能是“a”、“an”或“one”等等。这时候我们就需要用到重复限定符符号了。
表示重复的特殊符号有:
* 表示前面的子表达式出现零次或多次。
+ 表示前面的子表达式出现一次或多次。
? 表示前面的子表达式出现零次或多次。
如上面说的,如果需要查找数字字符串,正则表达式为:
`\b[0-9]+\b`
表达式中`+`号表示子表达式`[0-9]`可以重复一次到多次。可以匹配数字字符串“1”、“123”等。当然也可以匹配字符串“01”、“001”等。考虑到正常数字第一位不可能为“0”,可以将正则表达式改成:
`\b[1-9][0-9]*\b`
这样,表达式第1位就不为“0”了。可以匹配字符串“1”、“123”、“23456”等。
`?`也是个常用的重复特殊字符。这个符号常以一种选择的方式出现。例如要匹配单词“cat”或者复数的“cats”,正则表达式为:
`cat(s)?`
重复符号还能对子表达式起作用。例要匹配字符串“LinkedHashMap"和字符串“HashMap”,正则表达式为:
`(Linked)?HashMap`
限定重复
如果我们需要指定字符重复次数,可以用限定重复的特殊符号。如下:
`{n}` 前面表达式或子表达式重复n次。
`{n,} ` 前面的表达式或子表达式重复n次或多次。
`{n,m} ` 前面的表达式或子表达式重复n次到m次。m必须大于n。
上述重复特殊符号也可以用限定重复次数来表示,其中`*`符号相当于`{0,}`,`+`相当于`{1,}`,`?`相当于`{0,1}`。
匹配数字字符串可以用正则表达式表示如下:
`\b[1-9][0-9]{0,}\b`
如果我们要匹配一个1到4位数的数字字符串,也就是"1"到“9999”的字符串,可以用正则表达式:
`\b[1-9][0-9]{0,3}\b`
登录 | 立即注册