Scala正则表达式
Scala支持通过Regex类的scala.util.matching封装正则表达式。让我们看看一个例子,我们将尝试从Scala中一个语句中找出单词:
import scala.util.matching.Regex object Test { def main(args: Array[String]) { val pattern = "Scala".r val str = "Scala is Scalable and cool" println(pattern findFirstIn str) } }
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Some(Scala) C:/>
我们创建一个字符串,并调用r()方法就可以了。Scala中字符串隐式转换为一个RichString并调用该方法来获得正则表达式的一个实例。找到第一个正则表达式匹配,只需调用findFirstIn()方法。而非只找到第一次出现。如果想找到匹配的单词的所有事件,可以使用findAllIn()方法,并在情况下,有目标字符串中使用多个Scala的单词,这将返回所有匹配的集合单词。
可以使用mkString()方法来连接所产生的服务,可以使用管道(|)搜索Scala中小型和资本的情况下,使用正则表达式构造来代替或r()方法创建一个模式如下:
import scala.util.matching.Regex object Test { def main(args: Array[String]) { val pattern = new Regex("(S|s)cala") val str = "Scala is scalable and cool" println((pattern findAllIn str).mkString(",")) } }
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Scala,scala C:/>
如果想更换匹配的文本,可以使用replaceFirstIn()以取代第一个匹配项或replaceAllIn(),以取代所有出现如下:
object Test { def main(args: Array[String]) { val pattern = "(S|s)cala".r val str = "Scala is scalable and cool" println(pattern replaceFirstIn(str, "Java")) } }
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test Java is scalable and cool C:/>
形成正则表达式:
Scala继承了Java,这反过来又继承了大部分的Perl的功能,它的正则表达式语法。这里只是一些例子,应该是足够的说明:
下面是表,列出了所有的正则表达式元字符的语法可用在Java中:
子表达式 | 匹配 |
---|---|
^ | 匹配行头 |
$ | 匹配行尾 |
. | 匹配除换行符任何单个字符。用m选项也允许使之匹配换行符。 |
[...] | 匹配括号内任何单个字符。 |
[^...] | 匹配任何单个字符不是在括号中 |
A | 整个字符串的开始 |
z | 整个字符串结束 |
最终,除了允许的最后行结束整个字符串。 | |
re* | 匹配0或多次出现前面表达式。 |
re+ | 匹配1个或多个的先前东西 |
re? | 匹配0或1发生前表达式。 |
re{ n} | 精确匹配n个前面表达式的数量。 |
re{ n,} | 匹配n或多次出现前面的表达。 |
re{ n, m} | 至少匹配n和在前面的表现最为m次出现。 |
a|b | 匹配a或b。 |
(re) | 组正则表达式并记住匹配的文本。 |
(?: re) | 组正则表达式而不记住匹配的文本。 |
(?> re) | 匹配独立模式而不反向追踪。 |
w | 匹配单词字符。 |
W | 匹配非单词字符。 |
s | 匹配空白。相当于 [ f]. |
S | 匹配非空白。 |
d | 匹配数字。相当于 [0-9]. |
D | 匹配非数字。 |
A | 匹配开始的字符串。 |
匹配字符串的结尾。如果一个换行符存在,它只是换行之前匹配。 | |
z | 匹配字符串的结尾。 |
G | 匹配点,最后一次匹配结束。 |
反向引用以捕获组编号 "n" | |
匹配单词边界之外时,括号内。匹配退格(0×08)括号里面。 | |
B | 匹配非单词边界。 |
, , etc. | 匹配换行符,回车,制表符等 |
Q | 转义(引用)所有字符为 E |
E | 尾部引用开始 Q |
正则表达式的例子:
示例 | 描述 |
---|---|
. | 匹配除了换行符的任何字符 |
[Rr]uby | 匹配 "Ruby" 或"ruby" |
rub[ye] | 匹配"ruby" 或 "rube" |
[aeiou] | 匹配任何一个小写元音 |
[0-9] | 匹配任何数字;同 [0123456789] |
[a-z] | 匹配任意小写ASCII字母 |
[A-Z] | 匹配任意大写ASCII字母 |
[a-zA-Z0-9] | 匹配任何上述 |
[^aeiou] | 匹配元音以外的任何一个小写字符 |
[^0-9] | 匹配数字以外的任何其他 |
d | 匹配一个数字: [0-9] |
D | 匹配一个非数字: [^0-9] |
s | 匹配一个空白字符: [ f] |
S | 匹配非空白: [^ f] |
w | 匹配一个字符: [A-Za-z0-9_] |
W | 匹配 一个非单词字符: [^A-Za-z0-9_] |
ruby? | 匹配 "rub" or "ruby": the y is optional |
ruby* | 匹配 "rub" plus 0 or more ys |
ruby+ | 匹配 "rub" plus 1 or more ys |
d{3} | 匹配只有 3 个数字 |
d{3,} | 匹配 3 个或多个数字 |
d{3,5} | 匹配3, 4, 或5 个数字 |
Dd+ | 不分组: + repeats d |
(Dd)+/ | 分组: + repeats Dd 对 |
([Rr]uby(, )?)+ | 匹配 "Ruby", "Ruby, ruby, ruby", 等. |
需要注意的是每一个反斜杠上述字符串中出现两次。这是因为在Java和Scala一个反斜杠是一个转义字符的字符串,而不是一个普通字符显示出来的字符串。所以不是.. 需要写. 。得到的字符串中的一个反斜杠。请查看下面的例子:
import scala.util.matching.Regex object Test { def main(args: Array[String]) { val pattern = new Regex("abl[ae]d+") val str = "ablaw is able1 and cool" println((pattern findAllIn str).mkString(",")) } }
当上述代码被编译和执行时,它产生了以下结果:
C:/>scalac Test.scala C:/>scala Test able1 C:/>
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Scala正则表达式
本文地址:http://www.codeinn.net/scala/1224.html