经常会有查找符合某些复杂规则的字符串的需要,这时我们就要使用正则表达式。
正则表达式分为元字符和普通字符。
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
一般元字符后面接上表示次数的符号,表示元字符代表的出现的次数。例如*,+,{8},{2}.。。。
{5,12}至少5次最多12次
这里的
+是和
*类似的元字符,不同的是
*匹配
任意次(可能是0次),而
+则匹配1
次或更多次
代码/语法 | 说明 |
---|---|
* | 零次或更多次 |
+ | 一次或更多次 |
? | 零次或一次 |
{n} | n次 |
{n,} | n次或更多次 |
{n,m} | n到m次 |
举个例子
\w{6} 匹配连续6个字母或数字或下划线或汉字
\ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)。
\w* 匹配至少0个的字母或数字或下划线或汉字,所以一般没有单独这么写。可以a\w* ,以a开头的字符串或a
\d+ 匹配至少1个数字
scala> val regex="""\d+""".r
regex: scala.util.matching.Regex = \d+
regex: scala.util.matching.Regex = \d+
scala> val s="a334 23ff 1dddd"
s: String = a334 23ff 1dddd
s: String = a334 23ff 1dddd
scala> val m=regex.findAllIn(s)
m: scala.util.matching.Regex.MatchIterator = non-empty iterator
m: scala.util.matching.Regex.MatchIterator = non-empty iterator
scala> m.toArray
res5: Array[String] = Array(334, 23, 1)
res5: Array[String] = Array(334, 23, 1)
^\d{5,12}$因为使用了^和$,所以输入的整个字符串都要用来和\d{5,12}来匹配,也就是说整个输入必须是5到12个数字,因此如果输入的QQ号能匹配这个正则表达式的话,那就符合要求了。
scala> val regex="""\ba\w{2}\b""".r
regex: scala.util.matching.Regex = \ba\w{2}\b
regex: scala.util.matching.Regex = \ba\w{2}\b
scala> val s="ass alll ad"
s: String = ass alll ad
s: String = ass alll ad
scala> val m=regex.findAllIn(s)
m: scala.util.matching.Regex.MatchIterator = non-empty iterator
m: scala.util.matching.Regex.MatchIterator = non-empty iterator
scala> m.toArray
res2: Array[String] = Array(ass)
res2: Array[String] = Array(ass)
字符转义
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用\.和\*。当然,要查找\本身,你也得用\\.
例如:deerchao\.net匹配deerchao.net,C:\\Windows匹配C:\Windows。
指定区间段
如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办?
很简单,你只需要在方括号里列出它们就行了,像[aeiou]就匹配任何一个英文元音字母,[.?!]匹配标点符号(.或?或!)。
我们也可以轻松地指定一个字符范围,像[0-9]代表的含意与\d就是完全一致的:一位数字;同理[a-z0-9A-Z_]也完全等同于\w(如果只考虑英文的话)。
分支条件
当你使用正则表达式表示满足其中之一即可,用 | 连接两个正则
a | b 匹配分枝条件时,将会从左到右地测试每个条件,所以注意顺序
分组
只要将你的正则表达式用()括起来就是一组(\d{1,3}\.){3} 数字一到3个加上 . 这种情形共有3次,举例 344.2.12就符合
反义
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
表3.常用的反义代码
代码/语法
说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
例子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串。
有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外,其它任意字符都行的情况,这时需要用到反义:
表3.常用的反义代码
代码/语法
说明
\W 匹配任意不是字母,数字,下划线,汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou这几个字母以外的任意字符
例子:\S+匹配不包含空白符的字符串。
<a[^>]+>匹配用尖括号括起来的以a开头的字符串。
参考:http://deerchao.net/tutorials/regex/regex.htm