概述
所谓的正则表达式指的是 正确的, 符合特定规则的式子 , 它是一门独立的语言, 并且能被兼容到绝大多数的编程语言
中. 在scala中, 可以很方便地使用正则表达式来匹配数据。具体如下:
- Scala中提供了 Regex类 来定义正则表达式.
- 要构造一个Regex对象,直接使用 String类的r方法 即可.
- 建议使用三个双引号来表示正则表达式,不然就得对正则中的反斜杠进行转义.
格式
val 正则对象名 = """具体的正则表达式""".r
具体的正则表达式组成:
. 表示任意字符
+ 数量词, 表示前边的字符出现至少1次, 至多无所谓.
@ 表示必须是@符号, 无特殊含义.
\. 因为.在正则中有特殊的含义, 所以要转移一下, 使它变成普通的.
注:使用findAllMatchln方法可以获取到所有正则匹配到的数组(字符串)
案例一:效验邮箱是否合法
需求
- 定义一个字符串, 表示邮箱.
- 定义一个正则表达式,来匹配邮箱是否合法.
- 合法邮箱测试:qq12344@163.com
- 不合法邮箱测试:qq12344@.com
- 打印结果.
object demo {
def main(args: Array[String]): Unit = {
//1. 定义一个字符串, 表示邮箱.
val email:String = "qq12344@163.com"
//2. 定义一个正则表达式,来匹配邮箱是否合法.
/*
. 表示任意字符
+ 数量词, 表示前边的字符出现至少1次, 至多无所谓.
@ 表示必须是@符号, 无特殊含义.
\. 因为.在正则中有特殊的含义, 所以要转移一下, 使它变成普通的.
*/
val regex = """.+@.+\..+""".r
//3. 合法邮箱测试:qq12344@163.com
//4. 不合法邮箱测试:qq12344@.com
//5. 打印结果.
if(regex.findAllMatchIn(email).size!=0){
//合法邮箱
println(s"${email} 是一个合法的邮箱!")
}else{
println(s"${email} 是一个非法的邮箱!")
}
}
}
案例二:过滤所有不合法邮箱
需求
- 找出以下列表中的所有不合法的邮箱.
- “38123845@qq.com”, “a1da88123f@gmail.com”, “zhansan@163.com”, "123afadff.com
import scala.util.matching.Regex
object demo2 {
def main(args: Array[String]): Unit = {
//1. 找出以下列表中的所有不合法的邮箱.
//2. "38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com"
val strings = List("38123845@qq.com","a1da88123f@gmail.com","a1da88123f@gmail.com","123afadff.com")
//3.定义正则表达式子
val regex: Regex = """.+@.+\..+""".r
for (elem <- strings) {
if (regex.findAllMatchIn(elem).size==0){
println(elem+"是不合法的邮箱")
}
}
}
}
案例三:获取邮箱运营商
需求
- 定义列表, 记录以下邮箱:
"38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com"
- 使用正则表达式进行模式匹配,匹配出来邮箱营运商的名字。
例如:
邮箱zhangsan@163.com,需要将163(运营商的名字)匹配出来
提示:
- 使用括号来匹配分组
- 打印匹配到的邮箱以及运营商
object demo3 {
def main(args: Array[String]): Unit = {
//1. 定义列表, 记录邮箱.
val emlList = List("38123845@qq.com", "a1da88123f@gmail.com", "zhansan@163.com", "123afadff.com")
//2.定义正则表达式
val regex = """.+@(.+)\..+""".r
//3. 根据 模式匹配 匹配出所有合法的邮箱及其对应的运营商.
val result = emlList.map {
//email就是emlList这个列表中的每一个元素.
// company表示: 正则表达式中你用()括起来的内容, 也就是分组的数据.
case email @ regex(company) => email -> s"${company}"
case email => email -> "未匹配" }
//4.打印结果
println(result)
}
}