Scala-正規表現
この章では、Scalaが正規表現をサポートする方法について説明します。 Regex scala.util.matchingパッケージで利用可能なクラス。
単語を見つけようとする次のサンプルプログラムを試してください Scala ステートメントから。
例
import scala.util.matching.Regex
object Demo {
def main(args: Array[String]) {
val pattern = "Scala".r
val str = "Scala is Scalable and cool"
println(pattern findFirstIn str)
}
}
上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
Some(Scala)
文字列を作成し、 r( )その上でメソッド。Scalaは暗黙的にStringをRichStringに変換し、そのメソッドを呼び出してRegexのインスタンスを取得します。正規表現の最初の一致を見つけるには、単にfindFirstIn()方法。最初の出現のみを検索する代わりに、一致する単語のすべての出現を検索する場合は、findAllIn( ) メソッドであり、ターゲット文字列で使用可能な複数のScala単語がある場合、これは一致するすべての単語のコレクションを返します。
mkString()メソッドを使用して結果のリストを連結したり、パイプ(|)を使用してScalaの小さくて大文字のケースを検索したりできます。 Regex 代わりにコンストラクターまたは r() パターンを作成する方法。
次のサンプルプログラムを試してください。
例
import scala.util.matching.Regex
object Demo {
def main(args: Array[String]) {
val pattern = new Regex("(S|s)cala")
val str = "Scala is scalable and cool"
println((pattern findAllIn str).mkString(","))
}
}
上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
Scala,scala
一致するテキストを置き換えたい場合は、 replaceFirstIn( ) 最初の一致を置き換えるか、 replaceAllIn( ) すべてのオカレンスを置き換えます。
例
object Demo {
def main(args: Array[String]) {
val pattern = "(S|s)cala".r
val str = "Scala is scalable and cool"
println(pattern replaceFirstIn(str, "Java"))
}
}
上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
Java is scalable and cool
正規表現の形成
Scalaは正規表現構文をJavaから継承し、JavaはPerlのほとんどの機能を継承します。復習として十分ないくつかの例を次に示します-
以下は、Javaで使用可能なすべての正規表現メタ文字構文をリストした表です。
部分式 | マッチス |
---|---|
^ | 行頭に一致します。 |
$ | 行末に一致します。 |
。 | 改行以外の任意の1文字に一致します。mオプションを使用すると、改行にも一致させることができます。 |
[...] | 角かっこ内の任意の1文字に一致します。 |
[^ ...] | 角かっこで囲まれていない任意の1文字に一致します |
\\ A | 文字列全体の始まり |
\\ z | 文字列全体の終わり |
\\ Z | 許容される最終行ターミネータを除く文字列全体の終わり。 |
re * | 先行する式の0回以上の出現に一致します。 |
re + | 前のものの1つ以上に一致します |
再? | 前の式の0または1回の出現に一致します。 |
re {n} | 先行する式のn回の出現に正確に一致します。 |
re {n、} | 先行する式のn回以上の出現に一致します。 |
re {n、m} | 先行する式の少なくともn回および最大m回の出現に一致します。 |
a | b | aまたはbのいずれかに一致します。 |
(再) | 正規表現をグループ化し、一致したテキストを記憶します。 |
(?:再) | 一致したテキストを記憶せずに正規表現をグループ化します。 |
(?> re) | バックトラックなしで独立したパターンに一致します。 |
\\ w | 単語の文字に一致します。 |
\\ W | 単語以外の文字に一致します。 |
\\ s | 空白に一致します。[\ t \ n \ r \ f]と同等です。 |
\\ S | 非空白に一致します。 |
\\ d | 数字と一致します。[0-9]に相当します。 |
\\ D | 数字以外に一致します。 |
\\ A | 文字列の先頭に一致します。 |
\\ Z | 文字列の終わりに一致します。改行が存在する場合は、改行の直前と一致します。 |
\\ z | 文字列の終わりに一致します。 |
\\ G | 最後の試合が終了した試合ポイント。 |
\\ n | キャプチャグループ番号「n」への逆参照 |
\\ b | 角かっこで囲まれていない場合、単語の境界に一致します。角かっこ内の場合、バックスペース(0x08)に一致します。 |
\\ B | 単語以外の境界に一致します。 |
\\ n、\\ tなど。 | 改行、キャリッジリターン、タブなどに一致します。 |
\\ Q | \\ Eまでのすべての文字をエスケープ(引用)します |
\\ E | \\ Qで始まる引用を終了します |
正規表現の例
例 | 説明 |
---|---|
。 | 改行以外の任意の文字に一致します |
[Rr] uby | 「ルビー」または「ルビー」に一致 |
摩擦[はい] | 「ruby」または「rube」に一致 |
【あいおう】 | 任意の1つの小文字の母音に一致します |
[0-9] | 任意の数字に一致します。[0123456789]と同じ |
[az] | 任意の小文字のASCII文字に一致します |
[AZ] | 任意の大文字のASCII文字に一致します |
[a-zA-Z0-9] | 上記のいずれかに一致する |
[^ aeiou] | 小文字の母音以外に一致する |
[^ 0-9] | 数字以外のものと一致する |
\\ d | 数字に一致:[0-9] |
\\ D | 数字以外に一致する:[^ 0-9] |
\\ s | 空白文字に一致します:[\ t \ r \ n \ f] |
\\ S | 非空白に一致:[^ \ t \ r \ n \ f] |
\\ w | 1つの単語の文字に一致します:[A-Za-z0-9_] |
\\ W | 単語以外の文字に一致する:[^ A-Za-z0-9_] |
ルビー? | 「rub」または「ruby」に一致:yはオプションです |
ルビー* | 「摩擦」に0以上のysを加えたものに一致する |
ルビー+ | 「摩擦」と1つ以上のysを一致させる |
\\ 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」などに一致します。 |
Note−すべての円記号が上の文字列に2回表示されます。これは、JavaとScalaでは、単一の円記号が文字列リテラルのエスケープ文字であり、文字列に表示される通常の文字ではないためです。したがって、文字列に1つの円記号を含めるには、「\」の代わりに「\\」を記述する必要があります。
次のサンプルプログラムを試してください。
例
import scala.util.matching.Regex
object Demo {
def main(args: Array[String]) {
val pattern = new Regex("abl[ae]\\d+")
val str = "ablaw is able1 and cool"
println((pattern findAllIn str).mkString(","))
}
}
上記のプログラムをに保存します Demo.scala。このプログラムをコンパイルして実行するには、次のコマンドを使用します。
コマンド
\>scalac Demo.scala
\>scala Demo
出力
able1