Scala 正則表達(dá)式
scala 正則表達(dá)式
scala 通過 scala.util.matching 包中的 regex 類來支持正則表達(dá)式。以下范例演示了使用正則表達(dá)式查找單詞 scala :
import scala.util.matching.regex object test { ? ?def main(args: array[string]) { ? ? ? val pattern = "scala".r ? ? ? val str = "scala is scalable and cool" ? ? ? ? ? ? println(pattern findfirstin str) ? ?} }
執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac test.scala $ scala test some(scala)
范例中使用 string 類的 r() 方法構(gòu)造了一個(gè)regex對(duì)象。
然后使用 findfirstin 方法找到首個(gè)匹配項(xiàng)。
如果需要查看所有的匹配項(xiàng)可以使用 findallin 方法。
你可以使用 mkstring( ) 方法來連接正則表達(dá)式匹配結(jié)果的字符串,并可以使用管道(|)來設(shè)置不同的模式:
import scala.util.matching.regex object test { ? ?def main(args: array[string]) { ? ? ? val pattern = new regex("(s|s)cala") ?// 首字母可以是大寫 s 或小寫 s ? ? ? val str = "scala is scalable and cool" ? ? ? ? ? ? println((pattern findallin str).mkstring(",")) ? // 使用逗號(hào) , 連接返回結(jié)果 ? ?} }
執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac test.scala $ scala test scala,scala
如果你需要將匹配的文本替換為指定的關(guān)鍵詞,可以使用 replacefirstin( ) 方法來替換第一個(gè)匹配項(xiàng),使用 replaceallin( ) 方法替換所有匹配項(xiàng),范例如下:
object test { ? ?def main(args: array[string]) { ? ? ? val pattern = "(s|s)cala".r ? ? ? val str = "scala is scalable and cool" ? ? ? ? ? ? println(pattern replacefirstin(str, "java")) ? ?} }
執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac test.scala $ scala test java is scalable and cool
1. 正則表達(dá)式
scala 的正則表達(dá)式繼承了 java 的語法規(guī)則,java 則大部分使用了 perl 語言的規(guī)則。
下表我們給出了常用的一些正則表達(dá)式規(guī)則:
表達(dá)式 | 匹配規(guī)則 |
---|---|
^ | 匹配輸入字符串開始的位置。 |
$ | 匹配輸入字符串結(jié)尾的位置。 |
. | 匹配除"\r\n"之外的任何單個(gè)字符。 |
[...] | 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 |
[^...] | 反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。 |
\\a | 匹配輸入字符串開始的位置(無多行支持) |
\\z | 字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響) |
\\z | 字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響) |
re* | 重復(fù)零次或更多次 |
re+ | 重復(fù)一次或更多次 |
re? | 重復(fù)零次或一次 |
re{ n} | 重復(fù)n次 |
re{ n,} | |
re{ n, m} | 重復(fù)n到m次 |
a|b | 匹配 a 或者 b |
(re) | 匹配 re,并捕獲文本到自動(dòng)命名的組里 |
(?: re) | 匹配 re,不捕獲匹配的文本,也不給此分組分配組號(hào) |
(?> re) | 貪婪子表達(dá)式 |
\\w | 匹配字母或數(shù)字或下劃線或漢字 |
\\w | 匹配任意不是字母,數(shù)字,下劃線,漢字的字符 |
\\s | 匹配任意的空白符,相等于 [\t\n\r\f] |
\\s | 匹配任意不是空白符的字符 |
\\d | 匹配數(shù)字,類似 [0-9] |
\\d | 匹配任意非數(shù)字的字符 |
\\g | 當(dāng)前搜索的開頭 |
\\n | 換行符 |
\\b | 通常是單詞分界位置,但如果在字符類里使用代表退格 |
\\b | 匹配不是單詞開頭或結(jié)束的位置 |
\\t | 制表符 |
\\q | 開始引號(hào):\q(a+b)*3\e 可匹配文本 "(a+b)*3"。 |
\\e | 結(jié)束引號(hào):\q(a+b)*3\e 可匹配文本 "(a+b)*3"。 |
. 正則表達(dá)式范例
范例 | 描述 |
---|---|
. | 匹配除"\r\n"之外的任何單個(gè)字符。 |
[rr]uby | 匹配 "ruby" 或 "ruby" |
rub[ye] | 匹配 "ruby" 或 "rube" |
[aeiou] | 匹配小寫字母 :aeiou |
[0-9] | 匹配任何數(shù)字,類似 [0123456789] |
[a-z] | 匹配任何 ascii 小寫字母 |
[a-z] | 匹配任何 ascii 大寫字母 |
[a-za-z0-9] | 匹配數(shù)字,大小寫字母 |
[^aeiou] | 匹配除了 aeiou 其他字符 |
[^0-9] | 匹配除了數(shù)字的其他字符 |
\\d | 匹配數(shù)字,類似: [0-9] |
\\d | 匹配非數(shù)字,類似: [^0-9] |
\\s | 匹配空格,類似: [ \t\r\n\f] |
\\s | 匹配非空格,類似: [^ \t\r\n\f] |
\\w | 匹配字母,數(shù)字,下劃線,類似: [a-za-z0-9_] |
\\w | 匹配非字母,數(shù)字,下劃線,類似: [^a-za-z0-9_] |
ruby? | 匹配 "rub" 或 "ruby": y 是可選的 |
ruby* | 匹配 "rub" 加上 0 個(gè)或多個(gè)的 y。 |
ruby+ | 匹配 "rub" 加上 1 個(gè)或多個(gè)的 y。 |
\\d{3} | 剛好匹配 3 個(gè)數(shù)字。 |
\\d{3,} | 匹配 3 個(gè)或多個(gè)數(shù)字。 |
\\d{3,5} | 匹配 3 個(gè)、4 個(gè)或 5 個(gè)數(shù)字。 |
\\d\\d+ | 無分組: + 重復(fù) \d |
(\\d\\d)+/ | 分組: + 重復(fù) \d\d 對(duì) |
([rr]uby(, )?)+ | 匹配 "ruby"、"ruby, ruby, ruby",等等 |
注意上表中的每個(gè)字符使用了兩個(gè)反斜線。這是因?yàn)樵?java 和 scala 中字符串中的反斜線是轉(zhuǎn)義字符。所以如果你要輸出 \,你需要在字符串中寫成 \\ 來獲取一個(gè)反斜線。查看以下范例:
import scala.util.matching.regex object test { ? ?def main(args: array[string]) { ? ? ? val pattern = new regex("abl[ae]\\d+") ? ? ? val str = "ablaw is able1 and cool" ? ? ? ? ? ? println((pattern findallin str).mkstring(",")) ? ?} }
執(zhí)行以上代碼,輸出結(jié)果為:
$ scalac test.scala $ scala test able1
相關(guān)文章
- JDBC 教程
- JDBC 驅(qū)動(dòng)類型
- JDBC 連接數(shù)據(jù)庫范例
- JDBC 連接數(shù)據(jù)庫步驟
- JDBC Statement, PreparedStatement 和 CallableStatement
- JDBC ResultSet 結(jié)果集
- JDBC Resultset 結(jié)果集范例
- JDBC 事務(wù)保存點(diǎn)范例
- Scala 教程
- Scala 簡介
- Scala 類和對(duì)象
- Scala 文件 I/O
- Spring 教程
- Spring 模塊
- Spring 依賴注入
- Spring 自動(dòng)裝配
- Spring MVC教程
- Spring MVC表單標(biāo)簽庫
- Spring security