English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Scalaはscala.util.matchingパッケージを通じて Regex クラスを使用して正則表現をサポートしています。以下の例では、正則表現を使用して単語を検索しています。 Scala :
import scala.util.matching.Regex object Test { def main(args: Array[String]) { val pattern = "Scala".r val str = "ScalaはScalableでクールです" println(pattern findFirstIn str) } }
以下のコードを実行すると、出力結果が:
$ scalac Test.scala $ scala Test Some(Scala)
例ではStringクラスのr()メソッドを使用してRegexオブジェクトを構築しています。
その後、findFirstInメソッドを使用して最初の一貫させる項を見つけます。
全ての一致させる項を確認するにはfindAllInメソッドを使用できます。
正則表現の一致させる結果の文字列を結合するためにmkString( )メソッドを使用し、異なるパターンを設定するためにパイプ(|)を使用できます:
import scala.util.matching.Regex object Test { def main(args: Array[String]) { val pattern = new Regex("(S|s)cala") // 最初の文字は大文字Sまたは小文字sで大丈夫です val str = "Scalaは拡張可能でクールです" println((pattern findAllIn str).mkString(",")) // 結果を接続するために、コンマ(,)を使用します } }
以下のコードを実行すると、出力結果が:
$ scalac Test.scala $ scala Test Scala,scala
一致させるテキストを指定されたキーワードに置き換える必要がある場合、以下を使用できます: replaceFirstIn( ) 最初の一つの一貫させる項を置き換える方法、以下の例を示します: replaceAllIn( ) 全ての一致させる項を置き換える方法、以下の例を示します:
object Test { def main(args: Array[String]) { val pattern = "(S|s)cala".r val str = "Scalaは拡張可能でクールです" println(pattern replaceFirstIn(str, "Java")) } }
以下のコードを実行すると、出力結果が:
$ scalac Test.scala $ scala Test Javaは拡張可能でクールです
Scalaの正則表現はJavaの文法規則を継承しており、JavaはほとんどPerlの文法規則を使用しています。
以下に、常用の正則表現の規則を示します:
表現 | 一致させる規則 |
---|---|
^ | 入力文字列の始まりの位置を一致させる。 |
$ | 入力文字列の終わりの位置を一致させる。 |
. | 「\r\n」以外の任意の単一文字を一致させる。 |
[...] | 文字セット。含まれる任意の文字を一致させる。例えば、「[abc]」は「plain」中の「a」を一致させます。 |
[^...] | 逆文字セット。含まれていない任意の文字を一致させる。例えば、「[^abc]」は「plain」中の「p」、「l」、「i」、「n」を一致させます。 |
\\A | 入力文字列の開始位置を一致させる(多行サポートがありません) |
\\z | 文字列の終わり($に似ているが、多行オプションに影響されません) |
\\Z | 文字列の終わりまたは行の終わり(多行オプションに影響されません) |
re* | 0回または多次繰り返す |
re+ | 1回または多次繰り返す |
re? | 0回または1回繰り返す |
re{ n} | n回繰り返す |
re{ n,} | n回から繰り返す |
re{ n, m} | nからm回繰り返す |
a|b | aまたはbを一致させる |
(re) | reを一致させる、テキストを自動的に名前付けられたグループにキャプチャーします |
(?: re) | reを一致させる、マッチングされたテキストをキャプチャーせず、このグループにグループ番号を割り当てません |
(?> re) | 貪欲な子表現 |
\\w | アルファベット、数字、アンダースコア、漢字を一致させる |
\\W | 任意の非アルファベット、数字、アンダースコア、漢字の文字を一致させる |
\\s | 任意の空白文字を一致させる、例えば: [\t\n\r\f] |
\\S | 任意の非空白文字を一致させる |
\\d | 数字を一致させる、例えば: [0-9] |
\\D | 任意の非数字の文字を一致させる |
\\G | 現在の検索の開始位置 |
\\n | 改行符 |
\\b | 通常は単語の区切り位置ですが、文字クラス内で使用すると退格を表します |
\\B | 単語の開始または終了位置でない場所を一致させる |
\\t | タブ |
\\Q | 開始引用符:\Q(a+b)*3\E 「(a」のテキストを一致させる+b)*3「。」 |
\\E | 終端引用符:\Q(a+b)*3\E 「(a」のテキストを一致させる+b)*3「。」 |
例 | 説明 |
---|---|
. | 「\r\n」以外の任意の単一文字を一致させる。 |
[Rr]uby | 「Ruby」または「ruby」を一致させる |
rub[ye] | 「ruby」または「rube」を一致させる |
[aeiou] | 小文字のaeiouを一致させる |
[0-9] | 任意の数字を一致させる、例えば: [0123456789] |
[a-z] | 任意のASCII小文字を一致させる |
[A-Z] | 任意のASCII大文字を一致させる |
[a-zA-Z0-9] | 数字、大文字のアルファベット |
[^aeiou] | aeiou以外の文字を一致させる |
[^0-9] | 数字以外の文字を一致させる |
\\d | 数字を一致させる、例えば: [0-9] |
\\D | 数字以外を一致させる、例えば: [^0-9] |
\\s | スペースを一致させる、例えば: [ \t\r\n\f] |
\\S | スペース以外を一致させる、例えば: [^ \t\r\n\f] |
\\w | アルファベット、数字、アンダースコアを一致させる、例えば: [A-Za-z0-9_] |
\\W | 非アルファベット、数字、アンダースコアをマッチング-Za-z0-9_] |
ruby? | 0個または複数の y。 |
ruby* | 「rub」にマッチング |
ruby+ | 「rub」にマッチング 1 または複数の y。 |
\\d{3} | 正確にマッチング 3 数字。 |
\\d{3,} | マッチング 3 または複数の数字。 |
\\d{3,5} | マッチング 3 または4 または 5 数字。 |
\\D\\d+ | 無グループ: + 重複: |
(\\D\\d)+/ | グループ: + \D\dの重複 |
([Rr]uby(, )?)+ | "Ruby"、"Ruby, ruby, ruby"など、マッチング |
上表の各文字は2つの反斜線を使用しています。これは、Java と Scala の文字列内の反斜線がエスケープシンボルであるためです。したがって、\を出力する場合は、文字列内に\\を使用して1つの反斜線を取得する必要があります。以下の例を参照してください:
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(",")) } }
以下のコードを実行すると、出力結果が:
$ scalac Test.scala $ scala Test able1