String
はじめに
「見た目は JavaScript、頭脳(中身)は Ruby、(安定感は AC/DC)」 でお届けしているスクリプト言語 Kinx。言語はライブラリが命。ということでライブラリの使い方編。
今回は String です。
- 参考
- 最初の動機 ... スクリプト言語 KINX(ご紹介)
- 個別記事へのリンクは全てここに集約してあります。
- リポジトリ ... https://github.com/Kray-G/kinx
- Pull Request 等お待ちしております。
- 最初の動機 ... スクリプト言語 KINX(ご紹介)
文字列操作の基本インターフェース。String オブジェクトに括り付いたメソッドは特殊メソッド(と呼ぶメソッドがある、名前は今決めた)扱いで、文字列オブジェクトに直接作用させることができる。
String 特殊オブジェクト
特殊メソッドを持つオブジェクトを特殊オブジェクトと呼び(←今決めた)、String、Array、Integer、Double、Binary がある。特殊メソッドは、特殊オブジェクトが対象としているオブジェクト(String なら文字列)に対して直接作用させることができる。
例えば、以下のように関数定義してみよう。
String.greeting = function(name) {
System.println("Hello, I am %{name}.");
};
すると、以下のように書くことができるようになる。
"John".greeting();
実行してみよう。
Hello, I am John.
使い方によっては便利。ただし、ライブラリの追加(組み込み特殊メソッドの追加)で使う可能性がある ので乱用はあまりしないほうが良いかもしれない。
String
組み込み特殊メソッド
メソッド | 意味 |
---|---|
String.startsWith(str) | 文字列が str で始まれば true。 |
String.endsWith(str) | 文字列が str で終れば true。 |
String.find(str) | 文字列の中で str が見つかった位置(0~)を返す。見つからなかった場合は -1 を返す。 |
String.subString(str, start[, len]) |
str の部分文字列を返す。 |
String.replace(str, cond, repl) |
str から cond にマッチする部分を全て repl に置換する。cond は文字列または正規表現オブジェクトの指定が可能。 |
String.toInt(str) |
str を整数値に変換する。 |
String.toDouble(str) |
str を実数値に変換する。 |
String.parentPath(str) |
str をパスと認識し、親パスとなる部分文字列を返す。例)"ab/cd/ef.x".parentPath() → "ab/cd.x"
|
String.filename(str) |
str をパスと認識し、親パス部分を削除したファイル名部分文字列を返す。例)"ab/cd/ef.x".filename() → "ef.x"
|
String.stem(str) |
str をパスと認識し、ファイル名の stem 部分文字列を返す。例)"ab/cd/ef.x".stem() → "ef"
|
String.extnsion(str) |
str をパスと認識し、ファイル名の拡張子部分文字列を返す。例)"ab/cd/ef.x".extnsion() → ".x"
|
String.split(str, sep) |
str を sep を区切り文字として分割し、配列として返す。sep は文字列、または正規表現オブジェクトの指定が可能。 |
String.each(str, callback) |
str を 1 文字ずつ分割し、それを引数にして callback 関数を呼び出す。callback 関数の第 2 引数に index (0~) も渡される。 |
each
は現在残念ながら日本語はうまく分割してくれないので注意。正式リリースまでに UTF-8 対応はさせる予定。
特殊オペレーター
/
オペレーター
文字列に対して /
オペレーターを適用した場合、/
で連結した文字列を返す。その際、重複したセパレータは 1 つになる。
var a = "aa/bb" / "ccdd"; // => "aa/bb/ccdd"
var b = "aa/bb/" / "ccdd"; // => "aa/bb/ccdd"
var c = "aa/bb" / "/ccdd"; // => "aa/bb/ccdd"
=~
オペレーター
文字列に対して =~
を適用した場合、右辺値には正規表現オブジェクトを期待する。正規表現のオブジェクトではなかった場合、例外が送出される。
!~
オペレーター
文字列に対して !~
を適用した場合、右辺値には正規表現オブジェクトを期待する。正規表現のオブジェクトではなかった場合、例外が送出される。
後置 []
オペレーター
文字列に対してインデックスアクセスをした場合、その位置にある文字コードを整数値で返す。したがって、「5 文字目が 'a'
である」という判断をする場合は以下のように書く。
if (str[5] == 'a'[0]) {
/* ... */
}
ちょっと C と違うことに注意。文字 'a' は文字ではなく 文字列リテラル のため、最初の文字を示す [0]
が必要。
単項 *
オペレーター
単項 *
オペレーターを文字列に適用した場合、文字列を配列に変換する。
var a = *"abc"; // => [97, 98, 99]
尚、補足として配列に単項 *
オペレーターを適用すると、文字列に戻ってくる。
おわりに
文字列操作を簡単にしたいがためにスクリプト言語を使う、というのもよくあるシーン。そもそもコレ系スクリプトの元祖的な位置付けである Perl はテキスト処理が楽、ということで使われてた経緯もありますし。そういう意味で、文字列操作はプリミティブですが重要な機能。テキスト処理は C で書きたくない処理の一つですね。
ではまた次回。