Swiftでコードを書き始めて10日程。
日も浅いしあまり偉そうな事を言えないけど、個人的にSwiftは気に入っています。
色々な言語の良いトコ取りをしたと言われているだけに、コードを書くと分かりますが、うまく言えないけど謎の既視感があります。
なので簡単にコード書けて学習コストはかなり低いはず。
伊達にモダンな言語を謳ってませんね。
####ここから本題。
ある理由でちょっとした文字列操作をしたくて正規表現を使う必要が出てきました。
当然モダンなSwiftさんの事なんだから、JavascriptやRubyのように、正規表現リテラル使えるんじゃネ?と思いついた訳です。
正規表現リテラルと言えば、スラッシュで囲むアレ。
if ("abcd1234".match(/\d+/)) {
console.log("match!!");
}
とか
if /\d+/ =~ "abcd1234" then
print("match!!")
end
です。
(Rubyのコードほとんど書いた事ないですが。。。)
しかし残念な事に、Swiftには正規表現リテラルが使えない。
となると、NSRegularExpressionクラスを使うしかないのですが、このクラス、使いやすいとは言い難くてObjective-Cの時との様な冗長的なコードを書くはめになります。
それだとなんだか負けた気がするので、Swiftの機能の1つである演算子の定義を駆使して、
それっぽいものを実装しちゃいました。
コードはGitHubに置きました。
https://github.com/doitchusan/RegexLiteral
##使い方
抽出
/* 書き方1 */
var results1 = "abcd1234".match(/"\d"/) /* results1 == ["1"] */
/* 書き方2 */
var results2 = "abcd1234" ~ /"\d"/ /* results2 == ["1"] */
判定
/* Javascriptっぽい */
var isMatch1 = "abcd1234".isMatch(/"abcd\d{4}"/) /* isMatch1 == true */
/* Rubyっぽい書き方も */
var isMatch2 = "abcd1234" =~ /"abcd\d{4}"/ /* isMatch2 == true */
オプションの指定
/* g:複数マッチ */
var results1 = "abcd1234".match(/"\d"/.g) /* results1 == ["1", "2", "3", "4"] */
/* i:大文字・小文字を無視 */
var results2 = "abcd1234".match(/"A|B|C|D"/.i) /* results2 == ["a"] */
/* オプションの組み合わせもOK */
var results3 = "abcd1234".match(/"A|B|C|D"/.g.i) /* results3 == ["a", "b", "c", "d"] */
ちょっとした処理ならサクッと書けて便利。
上でも述べましたが、演算子の定義を利用して実装しています。
というかそもそも演算子定義の活用方法間違えている気もしますが、とりあえずスラッシュで囲む事は実現出来たから満足(ぇ
将来的にSwiftも正規表現リテラルが書けるようになると良いですね。