Web開発でよく使われる言語と言えばPHPとJavaScript
この2つの正規表現の表し方と違いについてまとめました。
PHPでの正規表現の表し方
PHPでは文字列として正規表現を作成します。
専用の正規表現クラスとかはありません。
例えば次がシンプルな正規表現の例
1 2 |
/** 正規表現の例 */ var pattern = '/\w+apple/'; |
正規表現を表すときはパターンを / で囲む必要があります。
例えば上コードだと // で囲まれた \w+apple が検索や置換に使われるパターンです。
また次のように正規表現にはパターン修飾子(オプション)を付けることも可能
1 2 |
/** オプション付き正規表現の例 */ var pattern = '/\\w+apple/i'; |
// の最後に i とか m とかのオプションを複数指定できます。
参考記事 : 正規表現で使えるオプション(パターン修飾子)まとめ
より詳しい使い方やコード例なんかは次でまとめた通り
文字列として表すというのがPHPの正規表現の特徴です。
あと文字列なので一部の文字にはエスケープが必要なことにも要注意
JavaScriptでの正規表現の表し方
お次はJavaScriptでの正規表現について
JavaScriptでは正規表現をRegExpオブジェクトとして表現します。
具体的には次の2通りの方法で作成することが可能
- 正規表現リテラルとして作成
- RegExppオブジェクトを直接作成
まず正規表現リテラルの場合、
次のようにパターンを // で囲むことでRegExpオブジェクトになります。
1 2 |
/** 正規表現リテラルの例 */ var regexp = /\w+apple/gi; |
上コードだと \w+apple の部分が実際の検索や置換に使われるパターン
また / の最後に g とか i とかのオプションを付けることも可能です。
参考記事 : 正規表現オプションの意味と使い方まとめ
そしてJSではRegExpオブジェクトを直接作成することも可能です。
例えば次がそのコード例
1 2 |
/** RegExpオブジェクトの例 */ var regexp = new RegExp('\\w+apple', 'gi'); |
RegExpのコンストラクタ関数には
- 第一引数にパターン
- 第2引数にオプション
が文字列(パターンの場合は直に書いてもOK)として渡せるようになっています。
あとは正規表現リテラルと同じように検索系や置換系のメソッドに渡して使用可能です。
より詳しい使い方やコード例は次記事でまとめた通り
上記事でも書いたようにパフォーマンス的には正規表現リテラルの方が上です。
この2つをどういう風に使い分けるかについては
- コード内で変更しない静的パターンの場合は正規表現リテラル
- コード内で動的に作るパターンの場合はRegExpオブジェクト
などのように使い分けるのがベストですね。
PHPとJavaScriptの正規表現の違いまとめ
以上がPHPとJavaScriptでの正規表現の表し方
この2つには考えてみると色々違いがあります。
ではこの2つの決定的な違いは何かというとまずは作成の仕方です。
その違いを分かりやすくまとめるなら次の通り
- PHPの場合は文字列として作成
文字列内でパターンを // で囲み、例えば ' /\\w+apple/' みたいに作成
- JavaScriptの場合はRegExpとして作成
パターンを // で囲み、例えば /\w+apple/ みたいに作成
このように全く作り方が異なります。
あと両者にはオプション(パターン修飾子)でも違いがあります。
その違いについて簡潔にまとめると次の通り
- PHPの場合は多くのオプションが使用可能
- JSの場合は4つのオプションのみ使用可能
JavaScriptの場合はオプションが制限されているみたいです。
こういう風に同じ正規表現でも比べてみると結構違います。
ただ違いがあるもののパターンで使える表現、
例えばいくつか例を挙げるすると
- ドット文字や \s みたいなエスケープ文字
- * や + などの繰り返しを表す表現
- ()や [] などのグループ化するための表現
みたいなものについてはPHPもJSも全く変わりません。
あくまで表現方法とかオプションが少しだけ違うだけ
なのでPHPとJSで全く違う正規表現を覚える心配はないです。
番外編 : CSSでの正規表現について
実はCSSでもセレクタに正規表現が使用できます。
とは言ってもPHPやJSと比べると「正規表現もどき」という表現が適切かも
具体的にはセレクタ内で次の3つの表現が使用可能です。
- 前方一致
- 後方一致
- 不完全一致
CSSなので本格的な検索とか置換はもちろんできません。
ただセレクタを簡潔に書くのに便利な表現です。
詳しい使い方やコード例は次でまとめた通り
僕自身あまり使うことはないですが、くどいセレクタを短くまとめる時とかに便利です。
ここまでのまとめ
ということでPHPとJSでの正規表現の違いをもう一度まとめ
- 作成方法の違い
PHPの場合は文字列として作成、JSの場合はRegExpオブジェクトとして作成
- オプションの違い
PHPの場合は多様なオプションが使用可能、JSの場合は4種類のみ
ざっとまとめるならこういう違いですかね。
ただパターンの書き方についてはPHPもJSもさほど変わらないと思います。