Kotlinの正規表現の使い方

目次

  1. 背景
  2. 正規表現クラスの宣言
    1. Raw String
  3. パターンが含まれているかチェックする
  4. 抽出
  5. グループ
  6. 置換
  7. まとめ
  8. ところで…
  9. 関連記事
    1. PR

背景

こんにちは。 かりんとうマニア(@karintozuki)です。
今回はKotlinでの正規表現の使い方を紹介します。

正規表現クラスの宣言

KotlinではRegExクラスを使ってパターンを定義します。

RegEx.kt
1
2
// a,b,cのうちいずれかにマッチ
val regex = Regex(pattern = "[abc]")

Raw String

正規表現を使用する時にバックスラッシュなどを
エスケープするのってめんどくさいですよね。

Kotlinでは"""(三つのダブルクオーテーション)で囲ったStringは
そのままの文字列(Raw String)として扱われるので、エスケープ無しで使えます。

RegEx.kt
1
2
3
4
5
// Raw Stringはエスケープ不要
"""\d"""

// 普通の文字列だとエスケープが必要
"\\d"

パターンが含まれているかチェックする

対象の文字列にパターンが含まれているかどうか
確認する際はcontainsMatchInを使います。

RegEx.kt
1
2
3
4
5
6
7
// 文字列に数字が含まれているかチェックする
val target = "1 apple. 2 bananas."
val regex = Regex("""\d""")

val isMatched = regex.containsMatchIn(target)
print(isMatched)
// 結果:true

文字列全体がマッチするかどうかを
確認する時はmatchesを使用します。

RegEx.kt
1
2
3
4
5
6
7
8
9
10
11
12
// 対象の文字列に数字のみが含まれているか確認する
val regex = Regex("""\d+""")

val target = "123"
val isMatched = regex.matches(target)
print(isMatched)
// 結果:true

val target2 = "4 apples"
val isMatched2 = regex.matches(target2)
print(isMatched2)
// 結果:数字以外も含まれているのでfalse

抽出

マッチした文章を抽出したい時は
find、もしくはfindAllを使用します。

findの返り値はMatchResult?型です。
パターンにマッチしない場合はnullを返します。

RegEx.kt
1
2
3
4
5
6
7
8
9
10
val target = "1 apple. 2 bananas."
val regex = Regex("""\d""")

val match = regex.find(target)
print(match?.value)
// 結果:1

val matches = regex.findAll(target)
matches?.forEach { match -> print("${match.value} ") }
// 結果:1 2

グループ

パターンの中に()を使うことでグループが使えます。

グループを抽出したいときは、
groupsを使用します。
groups[0]にマッチした全文が格納されていて、
1,2,3・・・と()グループの中身が格納されます。

RegEx.kt
1
2
3
4
5
6
7
8
9
10
11
12
val target = "090-1111-2222"
val regex = Regex("""(\d+)-(\d+)-(\d+)""")

val match = regex.find(target)

match?.groups?.forEach { group -> println("${group?.value}") }
/* 以下が格納されている
group[0]:090-1111-2222
group[1]:090
group[2]:1111
group[3]:2222
*/

置換

置換にはreplaceを使います。
最初のマッチのみ置換するときはreplaceFirstを使います。

また、${数字}を使うことで、
マッチした文字列を置換後の文字列に入れることができます。
(日本語での説明は難しすぎて諦めました。下の例を見て雰囲気をつかんでください笑)
このときの数字はグループの時と同じで、0を指定するとマッチ全文が入ります。

RegEx.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
val target = "090-1111-2222"
val regex = Regex("""\d""")
val replaced = regex.replace(target, "x")
print(replaced)
// 結果:xxx-xxxx-xxxx

val firstRplaced = regex.replaceFirst(target, "x")
print(replaced)
// 結果:x90-1111-2222

val replacedWithOriginal = regex.replace(target, "$0x")
print(replacedWithOriginal)
// 結果:0x9x0x-1x1x1x1x-2x2x2x2x

まとめ

Kotlinの正規表現についてまとめました。
お役に立てれば幸いです。

最後になりますが、
私は個人開発でアプリを作っています。

クイズ感覚で正規表現が楽しめるアプリ、正規表現クエストを作りました。

こんなKotlinの正規表現なんて
ニッチな記事を閲覧してくれる皆様なら笑
楽しんでいただけると思います。
https://www.regex.bedroomcomputing.com/

それじゃ今日はこの辺で。

ところで…

仕事で扱っている技術がレガシーだったり、同じことの繰り返しだったりで
最近、成長してないと感じてませんか?

転職することで、もっと成長できるかもしれません。

いますぐ転職しない人でも、とりあえずエージェントに登録しておいて
案件や年収を眺めるだけでも市場の需要を知ることができ、勉強になります。

ここでエンジニアに人気の転職サイトを紹介します。

レバテックキャリア
エンジニアとして働いていて実務経験があるなら、
求人数の充実具合からレバテックキャリアがおすすめです。
IT転職ではデファクト・スタンダードですね。
▼レバテック キャリア 登録はこちら▼


Tech Clips
Tech Clipsは年収500万以上&自社サービスを持った会社に特化した求人サイトです。
首都圏限定になってはしまいますが、
収入を増やしたい、自社サービスを持った企業への転職をしたい人におすすめです。

▼Tech Clips 登録はこちら▼


関連記事

こちらの記事もおすすめ。

アプリ未経験エンジニアが独学で個人開発Androidアプリを公開するまでにやったこと

PR

Team Geek
エンジニアが会社という組織の中で立ち回っていくために
必要な知識が詰まっています。
タイトルにもある通り、プログラミング大好きな
ギークの方におすすめです。