Swift で正規表現
みなさん Swift で正規表現使ったことありますか?僕は、iOSアプリ開発はじめたての頃、よく分からずググりまくっていました😇 今回は、そんな少しとっつきづらい正規表現を改めてまとめることで、再理解しちゃおうぜ!という記事です
正規表現とは?
文字列のパターンを表現する表記法のこと。
e.g)
パターン | ◯ | × |
---|---|---|
〇〇県 | 茨城県 | 北海道 |
iPhone〇〇 | iPhone11 | Google Pixel |
どう表すの?
通常の文字(リテラル) とメタ文字(メタキャラクタ) と呼ばれる特殊な役割を持つ記号を組み合わせて表示します。
通常の文字の並びの中に、「メタキャラクタ」(metacharacter)と呼ばれる特別な意味を与えられた記号などの組み合わせを埋め込む形でパターンの特徴を記述することができる。
参照: http://e-words.jp/w/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE.html
メタ文字には下記のようなものがあります。
「.」
「.」は改行以外の1文字を許容するメタ文字です(ワイルドカード)。
...です さむいです あついです newです
「*」
「*」は、直前の文字が0回以上繰り返すことを許容するメタ文字です。
釣りしたいなあ* 釣りしたいな 釣りしたいなあ 釣りしたいなあああああああああああ
「+」
「+」は、直前の文字が1回以上繰り返すことを許容するメタ文字です。
釣りしたいなあ* 釣りしたいなあ 釣りしたいなあああああああああああ
「」
「」は、括弧内に記述された範囲と一致する文字であれば許容するメタ文字です。
[01234567890123456789] 1 9 8
また、「-」を使用して連続する範囲を表すこともできます。下記が、「+」メタ文字と組み合わせた正規表現の例になります。
[0-90-9]+円です 100円です 999999999円です
括弧内の先頭に「^」を追加することで、範囲と一致しない文字列を許容する正規表現としても扱えます。
[^0-90-9]+ 寒い Fishing
さらに詳しく知りたい方は、下記のページで丁寧にまとめられているので参照して見てください🧑🔧
Swift で正規表現はどう書くの?
こう書きます🧑🔧
func isEmail(email: String) -> Bool { let pattern = "^[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}$" guard let regex = try? NSRegularExpression(pattern: pattern) else { return false } let checkingResults = regex.matches(in: email, range: NSRange(location: 0, length: email.count)) return checkingResults.count > 0 } print(isEmail(email: "yamato8010@apple.com")) // true print(isEmail(email: "hogehoge-hoge.com")) // false
NSRegularExpression
に、正規表現の文字列を渡すことで Swift で正規表現を扱えるようになります。
NSRegularExpression
公式ドキュメントにちゃんとメタ文字の情報が一覧でのっていました✨
参考
- http://www-creators.com/archives/4278
- https://qiita.com/soarflat/items/2b50c1efe2ea54a762d7
- https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE
- https://www-creators.com/archives/2612