Scala の正規表現
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 is Scalable and cool" println(pattern findFirstIn str) } }
上記のコードを実行すると、出力結果は次のようになります。
$ scalac Test.scala $ scala Test Some(Scala)
この例では、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 is scalable and cool" println((pattern findAllIn str).mkString(",")) // 使用逗号 , 连接返回结果 } }
上記のコードを実行すると、出力結果は次のようになります:
$ scalac Test.scala $ scala Test Scala,scala
If一致したテキストを指定したキーワードで置換するには、replaceFirstIn( ) メソッドを使用して最初に一致した項目を置換し、replaceAllIn( ) メソッドを使用して一致したすべての項目を置換します。例は次のとおりです。
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")) } }
上記のコードを実行して出力します。 結果は次のようになります。
$ scalac Test.scala $ scala Test Java is scalable and cool
正規表現
Scalaの正規表現はJavaの構文ルールを継承しており、Javaは主にPerl言語のルールを使用します。
次の表は、一般的に使用される正規表現ルールを示しています。<td が n 回以上繰り返されました< td="">
式 | 一致ルール |
---|---|
^ | は、入力文字列の先頭と一致します。 |
$ | は、入力文字列の末尾と一致します。 |
. | は、「rn」を除く任意の 1 文字と一致します。 |
[...] | 文字セット。に含まれる任意の文字と一致します。たとえば、「[abc]」は「plain」の「a」と一致します。 |
[^...] | 文字セットを反転します。含まれていない文字と一致します。たとえば、「[^abc]」は「plain」の「p」、「l」、「i」、および「n」に一致します。 |
\A | は入力文字列の先頭と一致します(複数行はサポートされません) |
\z | 文字列の末尾($と似ていますが、複数行オプションの処理には影響されません) |
\Z | 文字列の終わりまたは行の終わり (複数行オプションの処理の影響を受けません) |
re* | 0回以上繰り返します |
re+ | 1回以上繰り返します |
再? | 0回または1回繰り返します |
re{ n} | n回繰り返します |
re{ n,} | |
re{ n, m} | n回繰り返しますm 回移動して |
a|b | a または b に一致 |
(re) | match re し、テキストを自動的に名前が付けられたグループにキャプチャします |
(?: re) | match re は、一致するテキストをキャプチャせず、このグループにグループ番号を割り当てません |
(?> re) | 貪欲な部分式 |
\w | 文字、数字、アンダースコア、または漢字と一致します |
\W | は、文字、数字、アンダースコア、または中国語以外の文字と一致します |
\s | は、[tnrf]と同等の任意の空白文字と一致します |
\S | と一致します空白文字ではない任意の文字 文字 |
\d | は、[0-9] などの数字と一致します |
\D | は、数字以外の文字と一致します |
\G | 現在の検索 |
\n | 改行 |
\b | は通常、単語の境界位置ですが、文字クラスでバックスペースを表すために使用される場合、 |
\B | は次の位置に一致します単語の先頭または末尾ではありません |
\t | タブ文字 |
\Q | 引用符の開始: Q(a+b)*3E はテキスト "(a+b) と一致します※3」。 |
\E | 終了引用符: Q(a+b)*3E はテキスト「(a+b)*3」と一致します。 |
正規表現の例
例 | 説明 |
---|---|
. | は、「rn」を除く任意の 1 文字と一致します。 |
[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 のような数字以外の文字と一致します。 | はスペースと一致します。次のようになります。 [trnf] |
\S | はスペース以外と一致します。次のようになります。 [^ trnf] |
\w | は文字、数字、アンダースコアと一致します。次のようになります。 [A-Za-z0-9_] |
\W | は、次のような文字、数字、アンダースコアと一致します: [^A-Za-z0-9_] |
ruby? | は「」と一致しますrubb" または "ruby": y はオプションです |
ruby* | "rub" に 0 個以上の y を加えたものと一致します。 |
ruby+ | は、「rub」に 1 つ以上の y を加えたものと一致します。 |
\d{3} | は 3 つの数字に正確に一致します。 |
\d{3,} | 3 つ以上の数字を一致させます。 |
\d{3,5} | 3、4、または 5 つの数字を一致させます。 |
\D\d+ | グループ化なし: + d |
(\D\d)+/ | グループを繰り返す: + Dd ペアを繰り返す |
([Rr]uby(, )?) + | 「Ruby」、「Ruby、ruby、ruby」などに一致します |
上の表の各文字には 2 つのバックスラッシュが使用されていることに注意してください。これは、文字列内のバックスラッシュが Java と Scala ではエスケープ文字であるためです。したがって、.. を出力したい場合は、文字列に .\ を記述してバックスラッシュを取得する必要があります。次の例を確認してください:
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