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+は、「ru​​b」に 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