scala 正则表达式实战

47 阅读1分钟

正则表达式是处理字符串的强大工具,它可以帮我们快速实现字符串的查找、匹配、校验等操作,且跨编程语言通用。本文将以 Scala 语言为例,从基础的数字查找入手,逐步进阶到手机号格式的精准匹配,带你掌握 Scala 中正则表达式的核心用法。

一、正则表达式核心概念

在开始编码前,先明确几个核心概念:

  • 元字符:具有特殊含义的字符,如 \d 表示任意单个数字、[] 表示字符范围;
  • 量词:指定规则重复次数,如 {11} 表示前面的规则重复 11 次;
  • 边界符^ 表示字符串开头、$ 表示字符串结尾,用于精准匹配整串内容。

二、基础案例:查找字符串中的 11 位数字

首先实现一个简单需求:从目标字符串中查找是否存在 11 位连续数字。

1. 完整代码

package reg
/*
1.处理字符串
2.查找,在一个大的字符串中寻找是否也满足 规则(条件)的子串
3.匹配,效验。判断给定的字符串是否满足某些 规则(条件)
这里规则(条件)就是采用正则表达式写的特殊的字符串
正则表达式与具体的编程语言无关
是一个独立通用的计算机技术
*/
object reg01 {
  def main(args: Array[String]): Unit = {
//    1.定义正则表达式
//    2.给定要检查(查找)的目标字符串
//    3.调用正则的方法,输出结果
//    判断给定字符串是否有数字?

//    1.\d:它可以表示任意的一个数字!
//     量词:表示前面的规则要重复几次?
//     1.{11}:表示重复11次 \d{11}它可以表示一个11位的数字

//    1.定义正则表达式
    val reg = "\d(11)".r

//    2.给定要检查(查找)的目标字符串
    val target = "I like 我喜欢 数字 13456789456! "
    println("找到的结果是:")
    reg.findAllIn(target).foreach(println)
//    println("\") //tab

  }
}

三、进阶案例:精准匹配手机号格式

手机号有固定格式要求:

  1. 长度为 11 位;
  2. 第一位必须是 1;
  3. 第二位只能是 3/5/6/7/8/9;
  4. 后 9 位为任意数字。

2. 完整代码

package reg

/*
1.处理字符串
2.查找,在一个大的字符串中寻找是否也满足 规则(条件)的子串
3.匹配,效验。判断给定的字符串是否满足某些 规则(条件)
这里规则(条件)就是采用正则表达式写的特殊的字符串
正则表达式与具体的编程语言无关
是一个独立通用的计算机技术
 */

object reg02 {
  def main(args: Array[String]): Unit = {
//    1.定义正则表达式
//    2.给定要检查(查找)的目标字符串
//    3.调用正则的方法,输出结果
//    判断给定字符串是否有数字?

//    1.\d:它可以表示任意的一个数字!
//    2.[3,5,6,7,8,9]只能固定字符中的某一个

//     量词:表示前面的规则要重复几次?
//     1.{11}:表示重复11次 \d{11}它可以表示一个11位的数字


//    ^以此开头 ^\d{11} 必须是以11个数字开头的字符串
//    $以此结尾 \d{11}$ 必须是以11个数字结尾的字符串
//    \d{11}$:必须是以11个数字开头并且以11个数字结尾的字符串


//    1.定义正则表达式
//    val reg = "^1\d(10)$".r //第一位是1,后边跟10个数字
//    手机号的第二位3,5,6,7,8,9
   val reg = "^1[356789]\d(9)$".r //第一位是1,后边跟10个数字

//    2.给定要检查(查找)的目标字符串
    val target = "1345678456"
    println("找到的结果是:")
    reg.findAllIn(target).foreach(println)
//    println("\") // tab

  }
}