Kotlin: 文字列 - keijidosha/memo GitHub Wiki
- null または空文字列かどうかを判定
if( hoge.isNullOrEmpty()) { println( "Nullか空文字列" ) }
- null または空文字列、またはブランク(複数のスペース)かどうかを判定
if( hoge.isNullOrBlank()) { println( "Nullか空文字列かブランク" ) }
- length() メソッドではなく、length プロパティ(クラス拡張)
println( "123".length )
- 電話番号を分解してみる
val reg = Regex( "(\\d+)-(\\d+)-(\\d{4})" ) val matches = reg.matchEntire( "090-0001-2345" ) matches?.groupValues?.forEach{ println( it ) } // <== "090-0001-2345", "090", "0001", "2345" println( matches?.destructured?.component2()) // <== "0001" println( match?.groups?.get(2)?.value ) // <== "0001" println( match?.groups?.get(2)?.range ) // <== 4..7
- とりあえず簡単に分解してみる
拡張ファンクション化
(Regex( "(\\d+)-(\\d+)-(\\d{4})" ).find("090-0001-2345")?.groups ?: listOf<MatchGroup>()).forEach{ println( it?.value ) }
import kotlin.text.* fun Regex.match( str: String ): Collection<MatchGroup?> = find( str )?.groups ?: listOf<MatchGroup>() fun main( args: Array<String> ) { Regex( "(\\d+)-(\\d+)-(\\d{4})" ).match( "090-0001-2345" ).forEach{ println( it?.value ) } }
java.lang.String と kotlin.String は同じではない
val ks = "hoge"
val js:java.lang.String = ks
// ==> type mismatch: inferred type is kotlin.String but java.lang.String was expected
が、キャストすると代入できる
val ks = "hoge"
val js:java.lang.String = (ks as java.lang.String)
で、次のような Java のコードを Kotlin で実行しようとすると、エラーになる
String s = new String( "abc".getBytes("ISO-8859_1"), "UTF-8" );
Kotlin の場合
val s = String( "abc".getBytes("ISO-8859_1"), "UTF-8" )
// ==> too many arguments for public constructor String() defined in kotlin.String
Kotlin には kotlin.String( byte[], String) というコンストラクターがない??
そこで Kotlin では次のようにできる
import java.nio.charset.*
val s = "abc".toByteArray( Charset.forName( "ISO-8859-1" )).toString( Charset.forName( "UTF-8" ))
// または
val s = "abc".toByteArray( StandardCharsets.ISO_8859_1 ).toString( StandardCharsets.UTF_8 )
// Charset の渡し方を変えているだけで、やっていることは同じ
(参考)
kotlin.String のコンストラクターから java.lang.String のコンストラクターを呼び出す処理は、kotlin-runtime-sources.jar の kotlin/text/StringsJVM.kt に記述されている
- 部分文字列
Range を使うval hoge = "1234567890" hoge.substring( 3..5 ) // "456"
Java の substring( 3, 6 ) と同じ