Scala编程技巧:用户验证、正则表达式和隐式转换 #Scala # scala #正则表达式

在本文中,我们将探讨三个Scala编程的实用技巧:用户输入验证、正则表达式的应用以及隐式转换的使用。每个部分都会包含详细的代码示例和注释,帮助您更好地理解和应用这些概念。

1. 用户输入验证

简介: 在开发Web应用时,验证用户输入是确保数据一致性和安全性的关键步骤。

规则:

  • 长度在6-12之间
  • 不能以数字开头
  • 只能包含数字、大小写字母、下划线

代码示例:

Scala 复制代码
object Test01 {
  def main(args: Array[String]): Unit = {
    // 用户名验证规则
    val reg = "[a-zA-Z_]\\w{5,11}".r

    // 测试用户名
    val names = List("1admin", "admin1", "admin", "ad_123Ab", "admin123!")
    names.foreach(name => println(s"Username '$name' is valid: ${reg.matches(name)}"))
  }
}

实训建议: 尝试修改正则表达式以适应不同的用户名规则。

完整代码块一:

Scala 复制代码
package Test_12_9
//  验证用户是否合法
//  规则:
//  1.长度在6-12之间
//  2.不能数字开头
//  3.只能包含数字,大小写字母,下划线
object Test01 {
  def main(args: Array[String]): Unit = {
    val name1 = "1admin"  // 不合法,是数字开头。
    val name2 = "admin1"  // 合法
    val name3 = "admin"   // 不合法,长度不够
    val name4 = "ad_123Ab"    // 合法
    val name5 = "admin123!"   // 不合法,!是不允许的

    //通过正则表达式来判断
    val reg = "[a-zA-Z_]\\w{5,11}".r
//    val reg = "[a-zA-Z_][a-zA-Z0-9!]\\w{5,11}".r
    println(reg.matches(name1))   // matches对字符串做验证,返回boolean值
    println(reg.matches(name2))   // matches对字符串做验证,返回boolean值
    println(reg.matches(name3))   // matches对字符串做验证,返回boolean值
    println(reg.matches(name4))   // matches对字符串做验证,返回boolean值
    println(reg.matches(name5))   // matches对字符串做验证,返回boolean值
  }

}

2. 正则表达式应用

简介: 正则表达式是处理字符串的强大工具,特别是在数据提取和格式化方面。

代码示例:

Scala 复制代码
object Test02 {
  def main(args: Array[String]): Unit = {
    val str = "尊敬的张先生,您好!您在13777777777的手机号上买的xxxx货物到了"
    val reg = "(1[3-9]\\d{9}).*".r

    val newStr = reg.replaceAllIn(str, m => m.group(1) + "****")
    println(newStr)
  }
}

实训建议: 练习使用正则表达式提取和替换不同类型的数据。

完整代码块一:

Scala 复制代码
package Test_12_9

object Test02 {
  def main(args: Array[String]): Unit = {
    "张先生,您好! 手机号:13777777777"
    val str = "尊敬的张先生,您好!您在13777777777 的手机号上买的 xxxx货物到了"
    val str1 = "张先生,您好!ID : 11110020000101000X 你买的xxxx到了"
    // 开始的代码

//    val reg = "1[3-9]\\d{9}]".r
    val reg = "(1[3-9]\\d)(\\d{4})(\\d{4})".r
    val reg1 = "(\\d{6})(\\d{10})(\\d[\\dX])".r

//    val dd = "--------"
    val newstr = reg.replaceAllIn(str, m => {
      println(m.group(1))
      println(m.group(2))
      println(m.group(3))
      println("-" * 40)
      m.group(1) + "****" + m.group(3)

    })
    println(newstr)
    println("-" * 70)
    val newstr1 =reg1.replaceAllIn(str1,m=>{
      println(m.group(1))
      println(m.group(2))
      println(m.group(3))
      println("-"*40)
      m.group(1)+"--------"+ m.group(3)
    })
    println(newstr1)
  }

}

3. 隐式转换

简介: Scala的隐式转换允许在特定情况下自动转换类型,这可以简化代码,但也需谨慎使用。

代码示例:

Scala 复制代码
object Test03 {
  implicit def X(d: Double): Int = {
    println("implicit X 被调用了")
    d.toInt
  }

  def main(args: Array[String]): Unit = {
    var i: Int = 1
    i = 2.1  // 使用隐式转换将Double转换为Int
    println(i)  // 输出转换后的值
  }
}

实训建议: 创建自己的隐式转换,并在团队中讨论其利弊。

完整代码块一:

Scala 复制代码
package Test_12_9

object Test03 {
  // 复习隐式转换
  // 隐式转换:编译器偷偷地、自动地帮我们把一种数据类型转换为另一种类型。
  // 例如:int --> double
  // 它有失败的时候(double-->int),有成功的时候。
  // 当它转换失败的时候,我们提供一个工具,让它能成功。

  // 明确地,把double转成int
  // 定义一个隐式转换,将Double类型转换为Int类型
  implicit def X(d: Double): Int = {
    println("implicit X 被调用了")
    d.toInt
  }

  def main(args: Array[String]): Unit = {
    var i: Int = 1
//    var j: Double = 2.1

    // 使用隐式转换,将Double类型的j转换为Int类型
    i = 2.1    // 把 Double 转入 Int
//    j = i    // 把 Int 转入 Double

    // 打印变量i的值
    println(i)
  }
}

结语

通过本文的介绍,您应该对Scala中的用户输入验证、正则表达式应用和隐式转换有了更深入的了解。尝试将这些技巧应用到您的项目中,以提高代码的质量和可读性。

相关推荐
wifi___14 小时前
全局异常处理的原理
java·开发语言
平常心的技术小牛17 小时前
Qt-快速上手-QMenuBar
开发语言·qt
青 春 记 忆17 小时前
零基础入门Python11|Git实战:为任务管理器建立版本历史
开发语言·git·vscode·python·python3.11
余额瞒着我当琳19 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪20 小时前
WebClient内存配置解析
开发语言·springboot·webflux
jdksjw20 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠20 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
SL-staff21 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术
SomeB1oody21 小时前
【RustyML入门】6.0. 数学工具
开发语言·后端·机器学习·rust·教程
进制树1 天前
【飞控开发实战·⑲】ROS2无人机开发环境搭建:Jazzy安装、工作空间与hello_drone节点实战
开发语言·安全·无人机·课程设计