どもです。
この頃、正規表現を扱うことが増えたので、ちょっとど素人のままではいられなくなってきた。
ので、まじめに勉強してみようと思った次第です。
正規表現の超基本ルール
( ・ิω・ิ) そもそも正規表現って何やねん。
( ◉◞౪◟◉) 一定の規則に従った文字列を、1つの文字列で表現する方法。
( ・ิω・ิ) なんで正規表現なんて使うん?
( ◉◞౪◟◉) 長ったらしい文章の中から文字列を検索したり、置換したりできる。
( ◉◞౪◟◉) あるいは入力された文字列が特定の規則に従ってるかのチェック。
( ◉◞౪◟◉) 郵便番号とか、メールアドレスとか。
( ◉◞౪◟◉) で、正規表現の基本になるけど、
( ◉◞౪◟◉) 「Windows7」「WINDOWS8」「WINDOWS10」
( ◉◞౪◟◉) 言語によって仕様が若干違うが、phpならこれ全部まとめて
( ◉◞౪◟◉) /(windows|WINDOWS)([0-9]{1,2})$/iu
( ◉◞౪◟◉) まず正規表現ってのはスラッシュで囲んで表現するのだが、
( ◉◞౪◟◉) もうちょっと細かいところについては、下の4項目を参照な。
文字クラス
文字クラスとは、
いずれかが入力文字列に含まれると一致と見なされる文字のセット
です。
[0-9]の意味は、数字1文字です。
故にこの正規表現に於いて、Windows7は○ですが、WindowsXPは×
このほか、文字クラスには以下のようなものがあります。
[abc] | a,b,cいずれかの1文字 |
---|---|
[^abc] | a,b,c以外の1文字 |
[A-Z] | 大文字のアルファベット1文字 |
[0-9] | 数字1文字 |
[a-zA-Z0-9] | アルファベットか数字1文字 |
[!-~] | 半角文字1文字 |
\w | アルファベットか数字かアンダースコア1文字 |
\W | アルファベット、数字、アンダースコア以外の1文字 |
\d | [0-9]と同じ |
\D | [^0-9]と同じ |
\s | 空白1文字 ([ \r\t\n\f\v] と同じ) |
\S | 空白以外1文字 ([^ \r\t\n\f\v] と同じ) |
\n | 改行 |
\t | タブ |
( ・ิω・ิ) 基本、全部「1文字」なんやな。
( ・ิω・ิ) 数字5字なら「[0-9][0-9][0-9][0-9][0-9]」か。めんどいな。
( ◉◞౪◟◉) そんな面倒だったら正規表現は流行っていないな。
( ◉◞౪◟◉) ここで役立つのが「量指定子」になる。
量指定子
量指定子とは、
直前の文字(文字クラス・グループ)の量データ
です。
{1,2}の意味は、「1字~2字」。
直前の[0-9]に作用しているので、[0-9]{1,2}で「数字1字~2字」になります。
故にこの正規表現に於いて、Windows10は○ですが、Windows100は×
このほか、量指定子には以下のようなものがあります。
* | 0回以上の繰り返し |
---|---|
+ | 1回以上の繰り返し |
? | 0回または1回の出現 |
{n} | n回の繰り返し |
{n,m} | n回以上、m回以下の繰り返し |
{n,} | n回以上の繰り返し |
( ・ิω・ิ) ほーん。なかなか便利やん。
( ・ิω・ิ) しかし、一定の文字や任意の数字ができるのはわかったが、
( ・ิω・ิ) 任意の文字列ってのはできるんか?
( ◉◞౪◟◉) できる。
( ◉◞౪◟◉) 「文字クラス」とは別に「メタ文字」というのがある。
メタ文字
メタ文字とは、
その文字本来の意味とは異なり、プログラムで特別な意味を持たせた文字
です。
()は、グループ化を行います。
グループ化は、文字列を一纏めにして扱うものです。
例えば、/(あいう)+/ と記載した場合、「あいう」を1回以上の繰り返しと解釈されます。
[]は、文字クラスを示します。
{}は、一部の量指定子を指します。
$は、これが行末であることを指します。
|は、()の中で使い、「いずれか」の意味を持ちます。
(windows|WINDOWS)は、
「windows」と「WINDOWS」のどちらかという意味を持ちます。
また、[]などのメタ文字を文字列として使用したい場合は「\」を用います。
[]を文字列としたい場合は/\[\]/
\自身を文字列とする場合は\\です。
メタ文字には以下のようなものがあります。
() | グループ化 |
---|---|
[] | 一部の文字クラス |
{} | 一部の量指定子 |
. | 改行以外の1文字 |
^ | 行頭 |
$ | 行末 |
| | いずれか |
\ | 直後のメタ文字をエスケープする |
( ・ิω・ิ) なるほど。任意の文字なら/.+/っちゅーわけやな。
( ◉◞౪◟◉) ちなみに、$なしの/(windows|WINDOWS)([0-9]{1,2})/iuだと
( ◉◞౪◟◉) 後ろに何が入っていても問題ないので、
( ◉◞౪◟◉) 「Windows100」も許容されるぞ。
( ◉◞౪◟◉) しかし検索や置換の対象は「Windows10」までだから注意だ。
( ・ิω・ิ) はぁ。なんとなくわかったわ、正規表現。
( ・ิω・ิ) ところで、地味に気になっっとったんやけど、
( ・ิω・ิ) 最後の「iu」って何?
( ◉◞౪◟◉) 「修飾子」だ。正規表現の後にくっつけて使う。
修飾子
修飾子とは、
末尾のデリミタ(区切り文字、正規表現は/)の後ろにつけるオプション
です。
iは、大文字小文字を区別せず扱います。
iがない場合、「windows」と「Windows」は別の文字列として扱われますが、
iをつけると、「windows」も「Windows」も「WINDOWS」も同じものになります。
uは、php特有の修飾子で、マルチバイト(utf-8)対応されます。
これをつけないと、全角文字が望むようにマッチしない可能性が発生します。
例えば、「WINDOWS」と「windows」は
「iu」ではマッチしますが、
「i」単独ではマッチしません。
なお、jsでは「i」単独でマッチします。
修飾子には以下のようなものがあります。
i | 大小文字の違いを無視する |
---|---|
s | シングルラインモードにする(.が改行にマッチする) PHPのみ |
m | マルチラインモードにする(^と$が改行の直前直後にマッチ) |
u | マルチバイト(UTF-8)対応 PHPのみ ※utfでない環境で用いると正常に動かなくなるので注意 |
g | 繰り返しマッチングを行う JavaScriptのみ |
参考資料
okumocchi.jp:PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.0
サルにもわかる正規表現入門