Scala字符串

本章將介紹Scala中的字符串。 在Scala中的字符串和Java中的一樣,字符串是一個不可變的對象,也就是一個不能修改的對象。可以修改的對象,如數組,稱爲可變對象。字符串是非常有用的對象,在本節的最後部分,我們將介紹java.lang.String類的一些重要方法。

1.創建一個字符串

以下是創建一個字符串的代碼 -

var greeting = "Hello world!";

// 或者

var greeting:String = "Hello world!";

每當編譯器在代碼中遇到一個字符串文字時,它會創建一個帶有它的值的String對象,在這種情況下是「Hello world!」String關鍵字也可以在如上所示的第二個聲明中給出。

請嘗試以下示例程序。

object Demo {
   val greeting: String = "Hello, world!"

   def main(args: Array[String]) {
      println( greeting )
   }
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執行此程序。

D:\> scalac Demo.scala
D:\> scala Demo

Hello, world!

如前所述,String類是不可變的。創建後的String對象是無法更改的。如果有必要對字符串進行大量修改,那麼可考慮使用Scala中提供的StringBuilder類。

2. 字符串長度

用於獲取有關對象的信息的方法稱爲訪問器方法。一個可以與字符串一起使用的訪問器方法是length()方法,它返回字符串對象中包含的字符數。

使用以下代碼段來查找字符串的長度 -

例子

object Demo {
   def main(args: Array[String]) {
      var palindrome = "Dot saw I was Tod";
      var len = palindrome.length();

      println( "String Length is : " + len );
   }
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執行此程序。

$ scalac Demo.scala
$ scala Demo

String Length is : 17

3. 連接字符串

String類包括一個連接兩個字符串的方法 -

string1.concat(string2);

這將返回一個新的字符串,字符串string1的尾部添加字符串string2。您也可以使用concat()方法在字符串文字上操作,如下 -

"My name is ".concat("Zara");

字符串通常還使用+運算符連接,如 -

"Hello," + " world" + "!"

這將產生以下結果 -

"Hello, world!"

以下代碼行將兩個字符串相連接 -

object Demo {
   def main(args: Array[String]) {
      var str1 = "Dot saw I was ";
      var str2 =  "Tod";

      println("Dot " + str1 + str2);
   }
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執行此程序。

D:\>scalac Demo.scala
D:\>scala Demo

Dot Dot saw I was Tod

4. 創建格式化字符串

您可以使用printf()format()方法打印具有格式化數字或字符串的輸出。 String類具有format()方法,它返回String對象而不是PrintStream對象。

嘗試以下示例程序,它使用printf()方法 -

示例

object Demo {
   def main(args: Array[String]) {
      var floatVar = 12.456
      var intVar = 2000
      var stringVar = "Hello, Scala!"

      var fs = printf("The value of the float variable is " + "%f, while the value of the integer " + "variable is %d, and the string" + "is %s", floatVar, intVar, stringVar);

      println(fs)
   }
}

將上述程序保存在源文件:Demo.scala中,以下命令用於編譯和執行此程序。

D:\>scalac Demo.scala
D:\>scala Demo

The value of the float variable is 12.456000, 
while the value of the integer variable is 2000, 
and the string is Hello, Scala!()

5. 字符串插值

字符串插值是使用Scala編程語言創建字符串的新方法。此功能支持只在Scala-2.10及更高版本。字符串插值:直接在過程字符串文字中嵌入變量引用的機制。

字符串插值中有三種類型(插值器)實現。

5.1. ‘s’字符串插值器

文字's'允許在處理字符串時直接使用變量。任何在範圍中的String變量可以在字符串中使用。以下是's'字符串插值器的不同用法。

println語句中將String變量($name)附加到普通字符串(Hello)中,以下示例代碼片段用於實現's'插值器。

val name = 「James」
println(s 「Hello, $name」) //output: Hello, James

字符串插入器還可以處理任意表達式。 使用's'字符串插入器處理具有任意表達式(${1 + 1})的字符串(1 + 1)的以下代碼片段。任何表達式都可以嵌入到${}中。

println(s 「1 + 1 = ${1 + 1}」) //output: 1 + 1 = 2

嘗試實現's'插值器的示例程序如下 -

object Demo {
   def main(args: Array[String]) {
      val name = "James"

      println(s"Hello, $name")
      println(s"1 + 1 = ${1 + 1}")
   }
}

將上述程序保存在源文件:Demo.scala中,使用以下命令編譯和執行此程序。

D:\>scalac Demo.scala
D:\>scala Demo

Hello, James
1 + 1 = 2

5.2 ‘f’插值器

文字'f'插值器允許創建一個格式化的字符串,類似於C語言中的printf。 在使用'f'插值器時,所有變量引用都應該是printf樣式格式說明符,如%d%i%f等。

我們以一般的字符串爲例附加浮點值(height = 1.9d)和字符串變量(name =「James」)。下面的代碼片段實現'f'插值器。這裏$name%s打印String變量James$height%2.2f打印浮點值1.90

val height = 1.9d
val name = "James"
println(f"$name%s is $height%2.2f meters tall") //James is 1.90 meters tall

它是類型安全的變量引用,以下格式說明符要匹配,否則顯示錯誤。'f'插值器使用Java中可用String格式實用程序(格式說明符)。 默認情況下,變量引用後沒有字符。它將假定爲%s的字符串。

5.3 「原始」插值器

'raw'內插器類似於's'插值器,除了它不執行字符串內的文字轉義。下表中的代碼段將區別's''raw'插值器的用法。 在使用s\n效果的輸出中,新行作爲原始值輸出,也就是\n將不起作用。它將使用轉義字母打印完整的字符串。

  • 's'的插值器使用,程序代碼如下 -

    object Demo {
     def main(args: Array[String]) {
        println(s"Result = \n a \n b")
     }
    }

    輸出結果 -

    Result =
    a
    b
  • 'raw'的插值器使用,程序代碼如下 -

    object Demo {
     def main(args: Array[String]) {
        println(raw"Result = \n a \n b")
     }
    }

    輸出結果 -

    Result = \n a \n b

字符串方法

以下是java.lang.String類定義的方法列表,可以直接在Scala程序中使用 -

編號

方法

描述

1

char charAt(int index)

返回指定索引處的字符。

2

int compareTo(Object o)

將此String與另一個對象進行比較。

3

int compareTo(String anotherString)

按字典順序比較兩個字符串。

4

int compareToIgnoreCase(String str)

按字典順序比較兩個字符串,忽略大小寫差異。

5

String concat(String str)

將指定的字符串連接到該字符串的末尾。

6

boolean contentEquals(StringBuffer sb)

當且僅當此String表示與指定的StringBuffer的字符序列相同時,才返回true

7

static String copyValueOf(char[] data)

返回一個字符串,表示指定的數組中的字符序列。

8

static String copyValueOf(char[] data, int offset, int count)

返回一個字符串,表示指定的數組中的字符序列。

9

boolean endsWith(String suffix)

測試此字符串是否以指定的字符串爲後綴/結尾。

10

boolean equals(Object anObject)

將此字符串與指定對象進行比較。

11

boolean equalsIgnoreCase(String anotherString)

將此String與另一個String進行比較,並忽略大小寫。

12

byte getBytes()

使用平臺的默認字符集將此String編碼爲一系列字節,將結果存儲到新的字節數組中。

13

byte[] getBytes(String charsetName)

使用命名的字符集將此String編碼爲一系列字節,將結果存儲到新的字節數組中。

14

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

將此字符串從srcBeginsrcEnd索引處的字符複製到目標字符數組(dst)中。

15

int hashCode()

返回此字符串的哈希碼。

16

int indexOf(int ch)

返回指定字符第一次在字符串中出現的索引。

17

int indexOf(int ch, int fromIndex)

返回指定字符以指定的索引開始搜索第一次在字符串內出現的索引。

18

int indexOf(String str)

返回指定子字符串在字符串內第一次出現的索引。

19

int indexOf(String str, int fromIndex)

返回從指定的索引開始,指定子串的第一次出現在給定字符串中的索引。

20

String intern()

返回字符串對象的規範表示。

21

int lastIndexOf(int ch)

返回指定字符在字符串中最後一次出現的索引。

22

int lastIndexOf(int ch, int fromIndex)

返回指定字符在給定字符串中的最後一次出現的索引,它從指定的索引開始向後搜索。

23

int lastIndexOf(String str)

返回指定子字符串在字符串內的最右邊出現的索引。

24

int lastIndexOf(String str, int fromIndex)

返回指定子字符串在給定字符串中最後一次出現的索引,它從指定索引開始向後搜索。

25

int length()

返回此字符串的長度。

26

boolean matches(String regex)

測試這個字符串是否與給定的正則表達式匹配。

27

boolean regionMatches(boolean ignoreCase, int toffset, String other, int offset, int len)

測試兩個字符串區域是否相等。

28

boolean regionMatches(int toffset, String other, int offset, int len)

測試兩個字符串區域是否相等。

29

String replace(char oldChar, char newChar)

返回一個新的字符串,此字符串是使用newChar替換此字符串中所有出現的oldChar的結果。

30

String replaceAll(String regex, String replacement

使用replacement替換與給定正則表達式(regex)匹配的字符串中的每個子字符串。

31

String replaceFirst(String regex, String replacement)

用給定的replacement替換與給定正則表達式(regex)匹配的字符串中的第一個子字符串。

32

String[] split(String regex)

將此字符串拆分爲給定正則表達式的匹配項。

33

String[] split(String regex, int limit)

將此字符串拆分爲給定正則表達式的匹配項。

34

boolean startsWith(String prefix)

測試此字符串是否以指定的前綴開頭。

35

boolean startsWith(String prefix, int toffset)

測試此字符串是否以指定的前綴開頭,指定一個指定的索引。

36

CharSequence subSequence(int beginIndex, int endIndex)

返回一個新的字符序列,該序列是該序列的子序列。

37

String substring(int beginIndex)

返回一個新字符串,該字符串是此字符串的子字符串。

38

String substring(int beginIndex, int endIndex)

返回一個新字符串,該字符串是此字符串的子字符串。

39

char[] toCharArray()

將此字符串轉換爲新的字符數組。

40

String toLowerCase()

使用默認語言環境的規則將此String中的所有字符轉換爲小寫。

41

String toLowerCase(Locale locale)

使用給定的區域設置的規則將此String中的所有字符轉換爲小寫。

42

String toString()

此對象(已經是字符串)本身已被返回。

43

String toUpperCase()

使用默認語言環境的規則將此字符串中的所有字符轉換爲大寫。

44

String toUpperCase(Locale locale)

使用給定的區域設置的規則將此String中的所有字符轉換爲大寫。

45

String trim()

返回字符串的副本,省略前導和尾隨空格。

46

static String valueOf(primitive data type x)

返回傳遞數據類型參數的字符串表示形式。