LoginSignup
14
13

More than 5 years have passed since last update.

SwiftでJavascriptの正規表現リテラルっぽいものを実装してみた。

Last updated at Posted at 2014-11-07

Swiftでコードを書き始めて10日程。
日も浅いしあまり偉そうな事を言えないけど、個人的にSwiftは気に入っています。
色々な言語の良いトコ取りをしたと言われているだけに、コードを書くと分かりますが、うまく言えないけど謎の既視感があります。
なので簡単にコード書けて学習コストはかなり低いはず。
伊達にモダンな言語を謳ってませんね。

ここから本題。

ある理由でちょっとした文字列操作をしたくて正規表現を使う必要が出てきました。
当然モダンなSwiftさんの事なんだから、JavascriptやRubyのように、正規表現リテラル使えるんじゃネ?と思いついた訳です。
正規表現リテラルと言えば、スラッシュで囲むアレ。

Javascript

if ("abcd1234".match(/\d+/)) {
    console.log("match!!");
}

とか

Ruby
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も正規表現リテラルが書けるようになると良いですね。

14
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
13