Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away