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)