English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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は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|baまたは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