本章介绍Scala如何通过scala.util.matching包中提供的 Regex 类支持正则表达式。
尝试下面的示例程序,我们将尝试从语句中找出单词 Scala 。
import scala.util.matching.Regex
object Demo {
def main(args: Array[String]) {
val pattern="Scala".r
val str="Scala is Scalable and cool"
println</span><span class="pun">(</span><span class="pln">pattern findFirstIn str</span><span class="pun">)</span><span class="pln">
}
}
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
Some(Scala)
我们创建一个String并在其上调用 r()方法, Scala隐式地将String转换为RichString并调用该方法以获取Regex的。
您可以使用mkString()方法来连接输出列表,并且可以1使用管道(|)搜索Scala的小写大写字母,也可以使用 Regex 构造函数或 r()方法来创建模式。
import scala.util.matching.Regex111
def main(args: Array[String]) {
val pattern=new Regex("(S|s)cala")
val str="Scala is scalable and cool"
println</span><span class="pun">((</span><span class="pln">pattern findAllIn str</span><span class="pun">).</span><span class="pln">mkString</span><span class="pun">(</span><span class="str">","</span><span class="pun">))</span><span class="pln">
}
}
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
Scala,scala
如果您想替换匹配的文本,可以使用 replaceFirstIn()替换第一个匹配项,或者使用 replaceAllIn()替换所有匹配项。
object Demo {
def main(args: Array[String]) {
val pattern="(S|s)cala".r
val str="Scala is scalable and cool"
println</span><span class="pun">(</span><span class="pln">pattern replaceFirstIn</span><span class="pun">(</span><span class="pln">str</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Java"</span><span class="pun">))</span><span class="pln">
}
}
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
Java is scalable and cool
正则表达式
| Example | 描述 |
|---|---|
| . | 匹配换行符以外的任何字符 |
| [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 | 匹配空格字符:[\ t\ r\ n\ f] |
| \\S | 匹配非空格:[^\ t\ r\ n\ f] |
| \\w | 匹配一个单词字符:[A-Za-z0-9_] |
| \\W | 匹配一个非单词字符:[^ A-Za-z0-9_] |
| ruby? | 匹配“ rub”或“ ruby”:y是可选的 |
| ruby* | 匹配“ rub”加上0或更多y |
| ruby+ | 匹配“ rub”加上1个或多个y |
| \\d{3} | 精确匹配3位数字 |
| \\d{3,} | 匹配3个或更多数字 |
| \\d{3,5} | 匹配3、4或5位数字 |
| ([Rr]uby(, )?)+ | 匹配"Ruby", "Ruby, ruby, ruby" |
注意-每个反斜杠在上面的字符串中出现两次,这是因为在Java和Scala中,单个反斜杠是字符串文字中的转义字符,而不是出现在字符串中的常规字符。因此,您需要编写"\\"来代替字符串中的单个反斜杠,而不是"\"。
正则表达式示例
import scala.util.matching.Regex
object Demo {
def main(args: Array[String]) {
val pattern=new Regex("abl[ae]\d+")
val str="ablaw is able1 and cool"
println</span><span class="pun">((</span><span class="pln">pattern findAllIn str</span><span class="pun">).</span><span class="pln">mkString</span><span class="pun">(</span><span class="str">","</span><span class="pun">))</span><span class="pln">
}
}
将上述程序保存在 Demo.scala 中。以下命令用于编译和执行该程序。
\>scalac Demo.scala \>scala Demo
able1