1. 程式人生 > >Scala程式設計實戰—字串

Scala程式設計實戰—字串

作者:WenWu_Both
出處:http://blog.csdn.net/wenwu_both/article/
版權:本文版權歸作者和CSDN部落格共有
轉載:歡迎轉載,但未經作者同意,必須保留此段宣告;必須在文章中給出原文連結;否則必究法律責任

1.測試字串的相等性

val s1 = "Hello"
val s2 = "Hello"
val s3 = "H" + "ello"
s1 == s2 // return:True
s2 == s3 // return:True

不考慮字元大小寫的話,可以將比較字串先統一轉換成大寫或小寫,再進行”==”操作:

val s1 = "hello"
val s2 = "Hello" s1.toUpperCase == s2.toUpperCase // return: True

也可以退而求其次,使用Java字串類的equalsIngoreCase方法

val s1 = "hello"
val s2 = "Hello"
s1.equalsIgnoreCase(s2) // return: True

2.建立多行字串

在Scala中可以用3個雙引號建立多行字串

val foo = """This is a
             multiline
             String"""

3.分隔字串

使用大名鼎鼎的split命令

"Hello,World".split(",") // return: Array(Hello, World)

split方法接受正則表示式:

"hello world, this is Al".split("\\s+") // return: Array(hello, world, this, is, Al)

分隔並實現各要素頭尾空格的去除:

"aaa, bbb,ccc, ddd ".split(",").map(_.trim) // trim命令為去除字串頭尾空格

進一步可以通過replaceAll的方法實現字串要素中所有空格的去除:

"aa b,ccc , d d d"
.split(",") // return: Array(aa b,ccc , d d d) "aa b,ccc , d d d".split(",").map(_.replaceAll(" ","")) // return: Array(aab,ccc,ddd)

4.字串中的變數代換

本質上就是格式化字串。

(1)字串前加字母”s”,字串中的變數前新增”$”

val name = "Tom"
val age = 18
println(s"$name is $age years old!") // return: Tom is 18 years old!

在字串中使用變量表達式時,需要用{}包裹:

val age = 18
println(s"Age next year:${age + 1}") // return: Age next year:19

同時,訪問物件的屬性時,也要求用{}包裹:

case class Student(name:String, score:Int)
val Tom = Student("Tom", 99)
println(s"${Tom.name} has a score of ${Tom.score}")

(2)字串前加字母”f”,字串中的變數前新增”$”,變數後新增”%”設定格式:

val name = "Fred"
val weight = 200.00
println(f"$name weghts $weght%.0f pounds!")

(3)format方法(類似於Python中的格式化字串)

println("%s is %d years old".format(name, age)) 

printf的格式化常用符:

  • %c:字元
  • %d:十進位制數字
  • %e:指數浮點數
  • %f:浮點數
  • %i:整數(十進位制)
  • %o:八進位制數
  • %s:字串
  • %u:無符號十進位制數
  • %x:十六進位制數
  • %%:列印一個百分號
  • \%:列印一個百分號

去除轉義,可在字串前新增”raw”

println(raw"foo\nbar")

5.遍歷字串

(1)map方法

val upper = "hello, world".map(c => c.toUpper)
val upper = "hello, world".map(_.toUpper)
// 與filter過濾器組合使用
val upper = "hello, world".filter(_ != 'l').map(_.toUpper)
// 注意'l'為Char,而非String,故為單引號,雙引號會報錯

(2)for…yield

val upper = for (c <- "hello, world")yield c.toUpper

在for迴圈新增yield實際上是將每次迴圈的結果放到臨時存放區中,當迴圈結束的時候,在臨時存放區中的所有元素以一個集合的形式返回,其作用與map方法等同。

(3)foreach

迴圈列印:

"hello, world"foreach(println)

6.字串中的查詢模式

判斷字串是否符合某個正則表示式。

匹配數字:

val numPattern = "[0-9]+".r
val address = "123 Main Street Suite 101"
val match1 = numPattern.findFirstIn(address) // 第一個匹配的數字,返回:Option[String] = Some(123)
val matchs = numPattern.findAllIn(address)  // 返回的迭代器
val matchs = numPattern.findAllIn(address).toArray // 返回陣列 

上面例項是通過字串後面新增”.r”的方式建立正則表示式的,另外一種方式是引入Regex類

import scala.util.matching.Regex
var numPattern = new Regex("[0-9]+")

7.抽取String中模式匹配的部分

// 定義期望的模式
val pattern = "([0-9]+) ([A-Za-z]+)".r
// 從目標字串中提取正則組
val pattern(count, fruit) = "100 Bananas"

8.訪問字串中的字元中的一個字元

(1)Java的charAt方法

"hello".charAt(0)

(2)Scala的陣列方法

"hello"(0)