1. 概要

この短いチュートリアルでは、Kotlinの文字列から英数字以外のすべての文字を削除する方法を学習します。

2. 非英数字の削除

文字列から英数字以外のすべての文字を削除するために、 replace()拡張関数とともに正規表現を使用できます。 具体的には、次の正規表現はすべての英数字以外の文字と一致します。

val nonAlphaNum = "[^a-zA-Z0-9]".toRegex()

上記の正規表現は、(否定修飾子である ^ のために)小文字、大文字、または数字ではないすべての文字と一致します。 したがって、この正規表現を使用すると、文字列内の英数字以外のすべての文字を取り除くことができます。

val text = "This notebook costs 2000€ (including tax)"
val nonAlphaNum = "[^a-zA-Z0-9]".toRegex()
val justAlphaNum = text.replace(nonAlphaNum, "")
assertEquals("Thisnotebookcosts2000includingtax", justAlphaNum)

上に示したように、ユーロ記号、括弧、およびスペース文字を削除しています。

3. Unicode文字のサポート

残念ながら、同じ単純な正規表現では、異なる言語の文字と数字は認識されません。 たとえば、ここでは、ドイツ語のウムラウトが英数字以外の文字であるかのように削除されます。

assertEquals("hnlich", "ähnlich".replace(nonAlphaNum, ""))

上に示したように、「ähnlich」の「ä」の文字を誤って削除しています。 同じことが他のUnicode文字と数字にも当てはまります。

assertEquals("", "آب".replace(nonAlphaNum, "")) // water in Persian
assertEquals("", "۴۲".replace(nonAlphaNum, "")) // 42 in Arabic
assertEquals("ao", "año".replace(nonAlphaNum, "")) // year in Spanish

ここでは、正当な文字または数字であるにもかかわらず、いくつかのペルシャ文字、アラビア数字の数字、およびスペイン語のアクセント記号の付いた文字を削除します。 これを修正するために、2つの解決策があります。

まず、 \ p {}プロパティトークンを使用して正規表現を調整し、Unicodeの文字と数字を含めることができます

val nonAlphaNum = "[^a-zA-Z0-9\\p{L}\\p{M}*\\p{N}]".toRegex()

“ \\ p {L} \\ p {M} *” は、あらゆる種類のマークとアクセントが付いたすべてのUnicode文字に相当します。 また、“ \\ p {N}”はすべてのUnicode桁に相当します。 これで、この正規表現を使用して、Unicodeの文字と数字も認識できるようになります。

assertEquals("Thisnotebookcosts2000includingtax", justAlphaNum)
assertEquals("ähnlich", "ähnlich".replace(nonAlphaNum, ""))
assertEquals("آب", "آب".replace(nonAlphaNum, ""))
assertEquals("۴۲", "۴۲".replace(nonAlphaNum, ""))
assertEquals("año", "año".replace(nonAlphaNum, ""))

上に示したように、ここで誤って一部の正当な英数字を削除することはありません。

2番目の解決策として、 isLetterOrDigit()拡張関数を利用して、英数字以外の文字を除外できます

fun String.onlyAlphanumericChars() =
  this.asSequence().filter { it.isLetterOrDigit() }.joinToString("")

ここでは、 asSequence()拡張関数を使用して、途中で不要な中間配列とコレクションの作成を回避しています。 それに加えて、英数字を保持して新しい文字列に結合するだけなので、ロジックは非常に単純です。

4. 結論

このチュートリアルでは、Kotlinの文字列から英数字以外のすべての文字を削除するいくつかの方法を学びました。

いつものように、すべての例はGitHubから入手できます。