Kotlinの正規表現で真偽値を返すサンプルです。
目次
正規表現で真偽値を返す(完全一致と部分一致の違い)
JavaScript等の他言語と違い完全一致と部分一致でメソッドが異なるので注意が必要です。
正規表現で完全一致を行う場合は、matchesを使用します。
→文字列全体が一致した時にtrueを返し、一致しない時にfalseを返します。
正規表現で部分一致を行う場合は、containsMatchInを使用します。
→文字列の一部が一致した時にtrueを返し、一致しない時にfalseを返します。
サンプル
fun main() {
val regex = Regex("A[BC]D")
// 完全一致
println("ABD".matches(regex)) // true
// 部分一致 文字列の前後に別の文字があるのでfalse
println("* ABD *".matches(regex)) // false
// 部分一致 containsMatchInでtrue
println(regex.containsMatchIn("* ABD *")) // true
}
3行目の[BD]の角括弧は、ORを表し「A」と、「B」または「C」と「D」の意味です。
6行目は、完全一致のためtrueを返します。
9行目は、ABDの前後に別の文字があるので不一致でfalseを返します。
12行目は、ABDの前後に別の文字がありますが部分一致するのでtrueを返します。
任意の1文字(.)
fun main() {
val regex = Regex(".BC")
println("ABC".matches(regex)) //true
println("ACB".matches(regex)) //false
}
ピリオド(.)は、任意の1文字を表します。
任意の文字が0回以上(.*)
fun main() {
val regex = Regex("A.*D")
println("ABCD".matches(regex)) //true
println("ABD".matches(regex)) //true
println("AD".matches(regex)) //true
}
ドット(.)は任意の文字でアスタリスク(*)は直前の文字が0回以上の繰り返しを表します。
任意の文字が1回以上(.+)
fun main() {
val regex = Regex("A.+D")
println("ABCD".matches(regex)) //true
println("ABD".matches(regex)) //true
println("AD".matches(regex)) //false
}
ドット(.)は任意の文字でプラス(+)は直前の文字が1回以上の繰り返しを表します。
orを指定([])
fun main() {
val re1 = Regex("A[BC]")
println("AB".matches(re1)) //true
println("AC".matches(re1)) //true
println("ABC".matches(re1)) //false
}
2行目は、「A」と、「B」または「C」を指定しています。
6行目は、2文字目までの条件は合致しますが、3文字目があるのでfalseになります。
否定(^)
fun main() {
val re1 = Regex("ZZ[^AB]")
println("ZZZ".matches(re1));//true
println("ZZA".matches(re1));//false
println("ZZB".matches(re1));//false
}
2行目は、文字列の3文字目が「A」と「B」以外を指定しています。
先頭の文字列で検索する正規表現と似ていますが、こちらは角かっこ([])があります。
文字の範囲(-)
fun main() {
val re1 = Regex("A[A-C]C")
println("ABC".matches(re1));//true
println("AZC".matches(re1));//false
}
2行目は、文字列の2文字目が「A」または「B」または「C」の文字を指定しています。
先頭の文字列(^)
fun main() {
val re1 = Regex("^AB.")
println("ABC".matches(re1));//true
println("AZC".matches(re1));//false
}
2行目は、先頭が「AB」の文字を指定しています。
文字を否定で検索する正規表現と似ていますが、こちらは角かっこ([])がありません。
ピリオド(.)は、任意の1文字を表します。
末尾の文字列($)
fun main() {
val re1 = Regex(".BC$")
println("ABC".matches(re1));//true
println("AZC".matches(re1));//false
}
2行目は、末尾が「BC」の文字を指定しています。ピリオド(.)は、任意の1文字を表します。
連続する文字{数値}
fun main() {
val re1 = Regex("ac{2}b")
println("accb".matches(re1));//true
println("acccb".matches(re1));//false
println("acb".matches(re1));//false
}
2行目は、「c」が2回連続する文字を指定しています。
1桁以上{1,}
fun main() {
val re1 = Regex("[0-9]{1,}-")
// val re1 = Regex("\\d{1,}-")
println("1-".matches(re1));//true
println("123-".matches(re1));//true
println("ab1-".matches(re1));//false
println("a1b-".matches(re1));//false
}
2行目は、数値1桁以上とハイフン(-)を指定しています。
3行目も数値1桁以上を意味します。エスケープとエスケープのエスケープとしてバックスラッシュ(ユニコードのU+005C)つけます。環境によっては円マークで表示されます。
数値(0-9)の5桁+先頭と末尾も(0-9)
fun main() {
val re1 = Regex("^[0-9]{5}$")
println("12345".matches(re1));//true
println("123".matches(re1));//false 桁数不足
println("123a5".matches(re1));//false 文字あり
}
数値(0-9)と英字(a-f)の5桁+先頭と末尾も(0-9 or a-f)
fun main() {
val re1 = Regex("^[0-9a-f]{5}$")
println("123ab".matches(re1));//true
println("123a".matches(re1));//false 桁数不足
println("abcde".matches(re1));//true 英字のみ
println("12345".matches(re1));//true 数値のみ
}
郵便番号(数値3桁とハイフンと数値4桁)+先頭と末尾も(0-9)
fun main() {
val re1 = Regex("^[0-9]{3}-[0-9]{4}$")
// val re1 = Regex("^\\d{3}-\\d{4}$")
println("123-4567".matches(re1));//true
println("1234567".matches(re1));//false
println("1234-567".matches(re1));//false
}
2行目は、3行目と同じ意味です。エスケープとエスケープのエスケープとしてバックスラッシュ(ユニコードのU+005C)つけます。環境によっては円マークで表示されます。
ドット(.)を文字として指定(エスケープ)
fun main() {
val re1 = Regex("a\\.")
println("a.".matches(re1));//true
println("aa".matches(re1));//false
}
2行目は、ドット(.)を文字として扱います。「a.」を指定しています。
エスケープとエスケープのエスケープとしてバックスラッシュ(ユニコードのU+005C)をつけます。環境によっては円マークで表示されます。
ドット(.)にエスケープをつけない場合は任意の一文字という意味になります。
関連の記事