Kotlinの正規表現の使い方

目次

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

あなたの会社はあなたの技術を評価してくれていますか?
技術力を高めようと頑張っているのに、
技術が評価されないような会社にいたらそれは良い環境なのでしょうか?
エンジニアとして技術を高めたいのなら環境を選ぶことも大事です。

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


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

▼Tech Clips 登録はこちら▼