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)
実例では、Stringクラスのr()メソッドを使用して、正規表現オブジェクトを作成します。
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
一致するテキストを指定したキーワードに置き換える必要がある場合、 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=””></td n回以上繰り返す<>
式 | マッチングルール |
^ | 入力した文字列の先頭に一致します。 |
$ | 入力した文字列の最後に一致します。 |
. | “\r\n”以外の任意の1文字に一致します。 |
[…] | 文字集合。含まれている任意の文字に一致します。例えば、”[abc]”は”plain”にある”a”と一致します。 |
[^…] | 文字集合を逆にします。含まれていない任意の文字に一致します。例えば、”[^abc]”は”plain”にある”p”、”l”、”i”、”n”と一致します。 |
\\A | 入力した文字列の先頭に一致します(複数行にサポートしていません) |
\\z | 文字列の結末($に似てますが、複数行のオプションを処理することに影響されません) |
\\Z | 文字列の結末または行の結末(複数行のオプションを処理することに影響されません) |
re* | 0回以上繰り返します |
re+ | 1回以上繰り返します |
re? | 0回または1回に繰り返します |
re{ n} | n回に繰り返します |
re{ 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”以外の任意の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 | スペースに一致します。例えば、[\t\r\n\f]です |
\\S | スペース以外に一致します。例えば、 [^\t\r\n\f]です |
\\w | 文字、数字、アンダースコアに一致します。例えば、[A-Za-z0-9_]です |
\\W | 文字、数字、アンダースコア以外に一致します。例えば、 [^A-Za-z0-9_]です |
ruby? | “rub”或は”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)+/ | グループ化:+ 繰り返し \D\d のペア |
([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
コメントを残す