Scala基础【正则表达式、框架式开发案例】

一 正则表达式

1 介绍

正则表达式和模式匹配很像

模式匹配匹配的是规则:类型,常量,元组,集合,数组,对象,参数

正则表达式匹配的也是规则:String

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2 基本语法

def main(args: Array[String]): Unit = {
  //声明规则
  val regex = "a".r
  //准备数据
  val data = "zhangsan"
  //使用规则校验数据
  val maybeString: Option[String] = regex.findFirstIn(data)
  if(maybeString.isEmpty){
    println("字符串不匹配规则")
  }else{
    println("字符串匹配规则:" + maybeString.get)
  }

3 案例

(1)验证手机号

不使用正则表达式判断一个字符串是不是电话号码(部分功能)

def main(args: Array[String]): Unit = {
  println(checkTel("xxxxxxxxxxx"))
  println(checkTel("11111111111"))
}
def checkTel(tel : String) : Boolean ={
  if(tel.size == 11){
    var r = true
    Breaks.breakable{
      for(c <- tel){
        try{
          c.toString.toInt
        }catch {
          case e : Exception => {
            r = false
            Breaks.break()
          }
        }
      }
    }
    r
  }else{
    false
  }
}

使用正则表达式判断一个字符串是不是电话号码

\\d:表示字符串中有一个数字就行
^:表示字符串的开始位置
$:表示字符串的结束位置
^\\d$:字符串从头到尾只有一个数字
^\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d\\d$:匹配十一个数字
^\d{11}$:数字重复11次
[0-9]:类似于\\d
a|b:a,b两个条件满足之一即可
((13[0-9])|		13开头,后一位为0-9任何数字都可以
(14[5,7,9])|	14开头,后一位为5,7,9都可以
(15[^4])|		15开头,后一位不包括数字
(18[0-9])|		
(17[0,1,3,5,6,7,8]))
def main(args: Array[String]): Unit = {
    // 构建正则表达式
    println(isMobileNumber("18801234567"))
    println(isMobileNumber("11111111111"))
  }
  def isMobileNumber(number: String): Boolean ={
    val regex = "^((13[0-9])|(14[5,7,9])|(15[^4])|(18[0-9])|(17[0,1,3,5,6,7,8]))[0-9]{8}$".r
    val length = number.length
    regex.findFirstMatchIn(number.slice(length-11,length)) != None
  }

(2)提取邮件地址

def main(args: Array[String]): Unit = {
  // 构建正则表达式
  val r = """([_A-Za-z0-9-]+(?:\.[_A-Za-z0-9-\+]+)*)(@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)*(?:\.[A-Za-z]{2,})) ?""".r
  println(r.replaceAllIn("abc.edf+jianli@gmail.com   hello@gmail.com.cn", (m => "*****" + m.group(2))))
}

二 WordCount框架式开发规则

1 架构模式

(1)MVC

MVC:Model View Controller,将代码强制分解为三个组成部分,模型、视图、控制器

模型:分为数据模型和业务模型

视图:用户看到的界面

控制器:调度器,调度视图,业务和数据之间的关系

针对B/S结构的服务

(2)三层架构

Controller:控制器

Service:逻辑服务,对应模型中的业务模型

DAO:Data Acess Object,对应模型中的数据模型

出现问题方便处理,增强扩展性,降低耦合性

请求先访问控制器,由控制器找到对应的service,再由service访问DAO,层层递进,依次返回结果

2 代码实现

调用关系: TApplication – TController – TService – TDao

​ Application – Controller – Service – Dao

​ Util

(1)Application

package com.hike.bigdata.scala.summer.application

import com.hike.bigdata.scala.summer.common.TApplication
import com.hike.bigdata.scala.summer.controller.WordCountController

object WordCountApplication extends App with TApplication {

  execute {
    //将用户请求传递给Controller层
    val controller = new WordCountController
    //获取从Controller层传回的结果
    controller.dispatch()
  }
}

(2)Controller

package com.hike.bigdata.scala.summer.controller

import com.hike.bigdata.scala.summer.common.TController
import com.hike.bigdata.scala.summer.service.WordCountService

class WordCountController extends TController {

  // private:只在controller层中访问service层
  // Controller调度Service层
  private val wordCountService = new WordCountService

  def dispatch(): Unit = {

    //获取service层获得结果,输出到控制台
    val wordCount: Map[String, Int] = wordCountService.analysis()
    println(wordCount)
  }
}

(3)Service

package com.hike.bigdata.scala.summer.service

import com.hike.bigdata.scala.summer.common.TService
import com.hike.bigdata.scala.summer.dao.WordCountDao

class WordCountService extends TService {
  //只在service层中访问DAO层
  //Service层访问Dao层
  private val WordCountDao = new WordCountDao

  def analysis() = {

    // 从dao层获取文件内容,执行代码逻辑
    // 返回结果WordCount
    val lines = WordCountDao.readFile("data/word.txt")

    val words = lines.flatMap(
      line => line.split(" ")
    )
    val wordGroup = words.groupBy(word => word)
    val wordCount = wordGroup.mapValues(
      v => v.size
    )
    wordCount
  }
}

(4)Dao

package com.hike.bigdata.scala.summer.dao

import com.hike.bigdata.scala.summer.common.TDao

//使用抽象类中的方法
class WordCountDao extends TDao {

}

(5)Common

Application层的特质
package com.hike.bigdata.scala.summer.common

import com.hike.bigdata.scala.summer.util.EnvCache

//抽取Application层的通用方法
trait TApplication {
  def execute(op: => Unit): Unit = {
    //将系统配置发送到共享区域
    EnvCache.put("e:/")
    println("开启环境")
    //执行代码逻辑
    try {
      op
    } catch {
      case e: Exception => e.printStackTrace()
    }
    println("释放环境")
    EnvCache.clear()
  }

  //  def execute(): Unit ={
  //    //模板方法设计模式,一般以do开头
  //    println("开启环境")
  //
  //    try{
  //      doExecute()
  //    }catch {
  //      case e: Exception => e.printStackTrace()
  //    }
  //    println("释放环境")
  //  }
  //  def doExecute():Unit
}

Controller层的特质
package com.hike.bigdata.scala.summer.common

//Controller层的运行方法,由实现类实现
trait TController {
  def dispatch(): Unit
}

service层的特质
package com.hike.bigdata.scala.summer.common

//service层的执行方法,由实现类实现
trait TService {
  def analysis(): Any
}

Dao层的特质
package com.hike.bigdata.scala.summer.common

import com.hike.bigdata.scala.summer.util.EnvCache

import scala.io.{BufferedSource, Source}

trait TDao {
  //读取文件,返回文件内容
  def readFile(path: String) = {
    //EnvCache.get获取文件根目录
    val source: BufferedSource = Source.fromFile(EnvCache.get() + path)
    val lines = source.getLines().toList
    source.close()
    lines
  }
}

(6)Util

package com.hike.bigdata.scala.summer.util

object EnvCache {
  //在线程中开辟一块空间,这个空间内的数据可以供任意层取出
  //ThreadLocal不能解决线程安全问题,只是共享数据
  private val envCache: ThreadLocal[Object] = new ThreadLocal[Object]

  def put(data: Object): Unit = {
    envCache.set(data)
  }

  def get() = {
    envCache.get()
  }

  def clear(): Unit = {
    envCache.remove()
  }
}

(7)Bean

第1章,“可伸展的语言”,给出了Scala的设计,和它后面的理由,历史的概要。 第2章,“Scala的第一步”,展示给你如何使用Scala完成若干种基本编程任务,而不牵涉过多关于如何工作的细节。本章的目的是让你的手指开始敲击并执行Scala代码。 第3章,“Scala的下一步”,演示更多的基本编程任务来帮助你更快速地上手Scala。本章之后,你将能够开始在简单的脚本任务中使用Scala。 第4章,“类和对象”,通过描述面向对象语言的基本建设模块和如何编译及运行Scala程序的教程开始有深度地覆盖Scala语言。 第5章,“基本类型和操作”,覆盖了Scala的基本类型,它们的文本,你可以执行的操作,优先级和关联性是如何工作的,还有什么是富包装器。 第6章,“函数对象”,进入了Scala面向对象特征的更深层次,使用函数(即,不可变)分数作为例子。 第7章,“内建控制结构”,显示了如何使用Scala的内建控制结构,如,if,while,for,try和match。 第8章,“函数和闭包”,深度讨论了函数语言基础建设模块,函数。 ...... 第31章,“组合子解析”,显示了如何使用Scala的解析器组合子库来创建解析器。 第32章,“GUI编程”,展示了使用Scala库简化基于Swing的GUI编程的快速旅程。 第33章,“SCell电子表”,通过展示一个完整的电子表的实现,集中演示了Scala的一切。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OneTenTwo76

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值