Nginx 正規表現の詳細な説明

Nginx 正規表現の詳細な説明

Nginx (エンジン x) は、高性能な HTTP およびリバース プロキシ サーバーであり、IMAP/POP3/SMTP サーバーでもあります。 Nginx は、ロシアで 2 番目に訪問数の多いサイト Rambler.ru (ロシア語: Рамблер) 向けに Igor Sysoev によって開発されました。最初の公開バージョン 0.1.0 は、2004 年 10 月 4 日にリリースされました。

ソース コードは BSD のようなライセンスの下でリリースされており、安定性、豊富な機能セット、サンプル構成ファイル、システム リソースの消費量が少ないことで知られています。 2011 年 6 月 1 日に、nginx 1.0.4 がリリースされました。

Nginx は、BSD のようなプロトコルに基づいてリリースされた軽量の Web サーバー/リバース プロキシ サーバーおよび電子メール (IMAP/POP3) プロキシ サーバーです。その特徴は、メモリの占有量が少なく、強力な同時実行機能を備えていることです。実際、nginx の同時実行機能は、同じタイプの Web サーバーよりも優れています。中国本土の nginx Web サイトのユーザーには、Baidu、JD.com、Sina、NetEase、Tencent、Taobao などがあります。

今日は、正規表現の使用規則についてお話します。まずは簡単にいくつかの例を挙げて、説明していきたいと思います。

正規表現とは何か

正規表現とも呼ばれる正規表現。正規表現(英語:Regular Expression、コードではregex、regexp、またはREと略されることが多い)は、コンピューターサイエンスの概念です。正規表現は、特定のパターン (ルール) に一致するテキストを取得して置換するためによく使用されます。

多くのプログラミング言語は、正規表現を使用した文字列操作をサポートしています。たとえば、Perl には強力な正規表現エンジンが組み込まれています。正規表現の概念は、もともと sed や grep などの Unix ツールによって普及しました。正規表現は多くの場合「regex」と略され、単数形は regexp、regex、複数形は regexps、regexes、regexen となります。

正規表現は、いくつかの一般的な文字といくつかのメタ文字で構成されます。通常の文字には大文字、小文字、数字が含まれますが、メタ文字には特別な意味があります。これについては以下で説明します。

最も単純なケースでは、正規表現は通常の検索文字列のように見えます。たとえば、正規表現「testing」にはメタ文字が含まれていません。「testing」や「testing123」などの文字列と一致しますが、「Testing」とは一致しません。

正規表現を実際にうまく使用するには、メタ文字を正しく理解することが最も重要です。次の表に、すべてのメタ文字とその簡単な説明を示します。

メタ文字

説明する

\

次の文字マーカー、または後方参照、または 8 進エスケープ文字。たとえば、「\\n」は \n に一致します。 「\n」は改行文字に一致します。シーケンス「\\」は「\」に一致し、「\(」は「(」に一致します。これは、多くのプログラミング言語の「エスケープ文字」の概念に相当します。

^

入力行の先頭と一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は "\n" または "\r" の後の位置にも一致します。

$

入力行の末尾に一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は "\n" または "\r" の前の位置にも一致します。

*

先行する部分式と任意の回数一致します。たとえば、zo* は「z」に一致しますが、「zo」や「zoo」にも一致します。 *{0,}と同等です。

+

直前の部分式と 1 回以上 (1 回以上) 一致します。たとえば、「zo+」は「zo」や「zoo」に一致しますが、「z」には一致しません。 + は {1,} と同等です。

?

直前の部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「do」または「does」のいずれかに一致します。 ?{0,1}と同等です。

{n}

n は負でない整数です。特定の回数一致します。たとえば、「o{2}」は「Bob」の「o」とは一致しませんが、「food」の 2 つの o とは一致します。

{n,}

n は負でない整数です。少なくとも n 回一致します。たとえば、「o{2,}」は「Bob」の「o」には一致しませんが、「foooood」のすべての o には一致します。 「o{1,}」は「o+」と同等です。 「o{0,}」は「o*」と同等です。

{n,m}

m と n は両方とも負でない整数です(n<=m)。少なくとも n 回、最大 m 回一致します。たとえば、「o{1,3}」は、「fooooood」の最初の 3 つの o のグループと、最後の 3 つの o のグループに一致します。 「o{0,1}」は「o?」と同じです。カンマと 2 つの数字の間にスペースを入れることはできないことに注意してください。

?

この文字が他の修飾子 (*、+、?、{n}、{n,}、{n,m}) の直後に続く場合、一致パターンは非貪欲になります。非貪欲モードでは検索文字列のできるだけ少ない部分と一致しますが、デフォルトの貪欲モードでは検索文字列のできるだけ多くの部分と一致します。たとえば、文字列「oooo」の場合、「o+」は可能な限り多くの「o」に一致し、[「oooo」] になりますが、「o+?」は可能な限り少ない「o」に一致し、['o', 'o', 'o', 'o'] になります。

。ポイント

「\n」と「\r」を除く任意の 1 文字に一致します。 「\n」や「\r」を含む任意の文字を一致させるには、「[\s\S]」のようなパターンを使用します。

(パターン)

パターンを照合し、一致したものを取得します。取得された一致は、VBScript の SubMatches コレクションと JScript の $0...$9 プロパティを使用して、生成された Matches コレクションから取得できます。括弧文字を一致させるには、「\(」または「\)」を使用します。

(?:パターン)

非取得マッチング、パターンは一致しますが、一致結果は取得せず、後で使用するために保存しません。これは、または文字「(|)」を使用してパターンの一部を結合する場合に便利です。たとえば、「industr(?:y|ies)」は「industry|industries」よりも短い表現です。

(?=パターン)

非取得一致、つまり肯定的な肯定的な先読みは、任意の文字列一致パターンの先頭にある検索文字列と一致し、後で使用するために一致を取得する必要はありません。たとえば、「Windows(?=95|98|NT|2000)」は、「Windows2000」の「Windows」と一致しますが、「Windows3.1」の「Windows」とは一致しません。先読みでは文字は消費されません。つまり、一致が発生した後、先読みを含む文字の後からではなく、最後の一致の直後から次の一致の検索が開始されます。

(?!パターン)

非キャプチャ マッチング (正負先読み) では、パターンに一致しない文字列の先頭にある検索文字列が一致します。この一致は、後で使用するためにキャプチャする必要はありません。たとえば、「Windows(?!95|98|NT|2000)」は、「Windows3.1」の「Windows」と一致しますが、「Windows2000」の「Windows」とは一致しません。

(?<=パターン)

非取得マッチング、逆ポジティブプレビューは、順方向ポジティブプレビューと似ていますが、方向が逆です。たとえば、「(?<=95|98|NT|2000)Windows」は、「2000Windows」の「Windows」には一致しますが、「3.1Windows」の「Windows」には一致しません。

「(?<=95|98|NT|2000)Windows」は、現在、python3.6 の re モジュール テストでエラーを報告します。「|」で接続された文字列の長さは同じである必要があります。ここでは、「95|98|NT」の長さは 2 で、「2000」の長さは 4 であるため、エラーが発生します。

(?<!patte_n)

非取得マッチング、逆ネガティブ先読みは、ポジティブネガティブ先読みに似ていますが、方向が逆です。たとえば、「(?<!95|98|NT|2000)Windows」は「3.1Windows」の「Windows」と一致しますが、「2000Windows」の「Windows」とは一致しません。この場所は間違っています。問題があります

ここで使用される または 項目はいずれも 2 桁を超えることはできません。たとえば、「(?<!95|98|NT|20)Windows」は正しいですが、「(?<!95|980|NT|20)Windows」はエラーです。単独で使用する場合、制限はありません。たとえば、「(?<!2000)Windows」は正しい一致です。

上記と同様に、Python 3.6 では re モジュール内の文字列の長さは一貫している必要があり、必ずしも 2 である必要はありません。たとえば、“(?<!1995|1998|NTNT|2000)Windows” も許容されます。

x|y

x または y に一致します。たとえば、「z|food」は「z」または「food」に一致します (注意してください)。 "[zf]ood"は「zood」または「food」に一致します。

[xyz]

文字のコレクション。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。

[^xyz]

否定文字のセット。文字列に含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」内の任意の文字と一致します。

[あず]

文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[az]」は「a」から「z」までの範囲の任意の小文字のアルファベット文字に一致します。

注: ハイフンは、文字グループ内にあり、2 つの文字の間にある場合にのみ、文字の範囲を表すことができます。文字グループの先頭に表示されている場合は、ハイフン自体のみを表すことができます。

[^az]

負の文字範囲。指定された範囲外の任意の文字に一致します。たとえば、「[^az]」は「a」から「z」の範囲外の任意の文字に一致します。

\b

単語の境界、つまり単語とスペースの間の位置に一致します (つまり、正規表現には「一致」の概念が 2 つあり、1 つは文字の一致、もう 1 つは位置の一致です。ここでの \b は位置と一致します)。たとえば、「er\b」は「never」の「er」と一致しますが、「verb」では一致しません。また、「\b1_」は「1_23」の「1_」と一致しますが、「21_3」では一致しません。

\B

非単語境界に一致します。 「er\B」は「verb」の「er」と一致しますが、「never」の「er」とは一致しません。

\cx

x で示される制御文字と一致します。たとえば、\cM は Control-M またはキャリッジリターンに一致します。 x の値は AZ または az のいずれかである必要があります。それ以外の場合、c はリテラルの「c」文字として扱われます。

\d

数字文字と一致します。 [0-9]に相当します。 grepは-Pを追加する必要があります、perl正規表現はサポートしています

\D

数字以外の文字に一致します。 [^0-9]と同等です。 Grepは-Pを追加する必要があります、Perlの正規表現はサポートしています

\f

フォームフィード文字と一致します。 \x0c および \cL と同等です。

\n

改行文字に一致します。 \x0a および \cJ と同等です。

\r

復帰文字と一致します。 \x0d および \cM と同等です。

\s

スペース、タブ、フォーム フィードなど、非表示の文字と一致します。 [ \f\n\r\t\v] と同等です。

\S

表示されている任意の文字に一致します。 [^ \f\n\r\t\v] と同等です。

\t

タブ文字に一致します。 \x09 および \cI と同等です。

\v

垂直タブ文字に一致します。 \x0b および \cK と同等です。

\w

アンダースコアを含む任意の単語文字に一致します。 "[A-Za-z0-9_]" に似ていますが、同等ではありません。"単語" 文字は Unicode 文字セットを使用します。

\W

単語に含まれない任意の文字に一致します。 "[^A-Za-z0-9_]"と同等です。

\xn

n に一致します。ここで、n は 16 進数のエスケープ値です。 16 進エスケープ値は正確に 2 桁の長さである必要があります。たとえば、「\x41」は「A」に一致します。 「\x041」は「\x04&1」と同等です。正規表現では ASCII エンコードを使用できます。

\num

num に一致します。ここで、num は正の整数です。取得した一致への参照。たとえば、「(.)\1」は 2 つの連続する同一文字に一致します。

\n

8 進エスケープ値またはバック参照を識別します。 \n の前に少なくとも n 個のキャプチャされたサブ式がある場合、n は後方参照になります。それ以外の場合、n が 8 進数 (0 ~ 7) であれば、n は 8 進エスケープ値になります。

\nm

8 進エスケープ値またはバック参照を識別します。 \nm の前に少なくとも nm 個のキャプチャされたサブ式がある場合、nm は後方参照になります。 \nm の前に少なくとも n 個の get がある場合、n はバック参照であり、その後にリテラル m が続きます。前の条件のいずれも満たされず、n と m の両方が 8 進数 (0 ~ 7) の場合、\nm は 8 進エスケープ値 nm と一致します。

\nml

n が 8 進数 (0-7) で、m と l の両方が 8 進数 (0-7) の場合、8 進エスケープ値 nml と一致します。

\国連

n に一致します。ここで、n は 4 つの 16 進数字で表される Unicode 文字です。たとえば、\u00A9 は著作権記号 (&copy;) と一致します。

\p{P}

小文字の p はプロパティを表し、Unicode プロパティを示し、Unicode 正規表現の接頭辞として使用されます。括弧内の「P」は、Unicode 文字セットの 7 つの文字属性の 1 つである句読点文字を示します。

他の 6 つのプロパティは次のとおりです。

L: 文字;

M: マーキング記号(通常は単独では表示されません)

Z: 区切り文字(スペース、改行など)

S: 記号(数学記号、通貨記号など)

N: 数字(アラビア数字、ローマ数字など)

C: その他のキャラクター。

*注: この構文は、JavaScript などの一部の言語ではサポートされていません。

\<

\>

単語の先頭 (\<) と末尾 (\>) に一致します。たとえば、正規表現 \<the\> は、文字列「for the wise」内の「the」と一致しますが、文字列「otherwise」内の「the」とは一致しません。注意: このメタ文字はすべてのソフトウェアでサポートされているわけではありません。
() (と)の間の表現を「グループ」として定義し、この表現に一致する文字を一時領域に保存します(正規表現では最大9文字を保存できます)。一時領域は\1から\9までの記号を使用して参照できます。
|一致する 2 つの条件に対して論理「OR」演算を実行します。たとえば、正規表現 (him|her) は、「it ought to him」や「it ought to her」には一致しますが、「it ought to them」には一致しません。注意: このメタ文字はすべてのソフトウェアでサポートされているわけではありません。

例1: Wap側アクセスをPC側ドメイン名に自動リダイレクト

この場合の要件は、携帯電話を使用してドメイン名 www.baidu.com にアクセスすると、自動的に m.baidu.com に書き換えられることです。ドメイン名 www.souhu.com にアクセスすると、ドメイン名 m.souhu.com に書き換えられます。

if ( $server_name ~ ((|www.|)([if ( $ser|
 #メインドメイン名をフィルタリングする if ( $server_name ~ ((www.|)([\S\s]*)) ) {
  $domain $3 を設定します。
 }

 #初期値を設定します。set $temp 0;

 #支払いドメイン名かどうかを判定する if ( $host ~* (pay|zf) ) {
  $temp を "${temp}1" に設定します。
 }

 #携帯電話かどうかを判断します if ($http_user_agent ~* (mobile|nokia|iphone|ipad|android|samsung|htc|blackberry)) {
  $temp を "${temp}2" に設定します。
 }

 #ジャンプするかどうか判断する if ( $temp = "02" ) {
  ^(.*) https://app.$domain を永久に書き換えます。
 }

スクリプトロジック分析:

まず、メインドメイン名を取得する必要があるため、正規表現を使用して一致させる必要があります。ドメイン名 www.baidu.com を例にとると、最初に表示されるのは www. フィールドですが、ユーザーが直接 baidu.com と入力してアクセスする場合もあるため、ここでは (www.|) を使用して一致させ、次にこのフィールドを一致させます。以下の $3 は、3 番目の括弧内の値を取得し、最終的に変数 $a に割り当てることを意味します。次の手順では、組み込み変数 $http_user_agent を使用して、ユーザーがサイトにアクセスする方法を判断し、リダイレクト操作を実行します。

例2: Nginx IPホワイトリスト

この場合の要件は、バックエンド アクセスが特定の IP アドレスからのアクセスのみを許可することです。他の IP アドレスがアクセスした場合は、別のエラー ページにジャンプするか、直接ホームページに戻ります。

#初期値を定義する $my_ip を 0 に設定する;

#指定されたホワイトリストかどうかを判断します if ( $http_x_forwarded_for ~* "10.0.0.1|172.16.0.1" ){
 $my_ip を 1 に設定します。
}

# ホワイトリストにないIPをリダイレクトする if ( $my_ip = 0 ) {
 ^/$ /40x.html を書き換えます。
}

スクリプトロジック分析:

これは実は、ユーザーがパソコンからアクセスしているのか、携帯電話からアクセスしているのかという上記の判断と同じですが、異なるのは組み込み変数だけです。Nginx の組み込み変数では、$http_x_forwarded_for がお客様がアクセスした実際の IP アドレスなので、この組み込み変数を判断に使用し、同時に初期値を追加します。

例3: URLアドレスを書き換えて送信されたコンテンツを非表示にする

この場合の要件は、フォームコンテンツを送信した後、http://baidu.com/index.php?user=admin&pass=123などの一部のパラメータを除いたURLアドレスが表示されるため、URLをhttp://baidu.com/indexに書き換える必要があることです。

^/(\w+)/(\w+)/z(\d+) /$1/$2/$3/$arg_x/$arg_y? を書き換えますか? 永久的に;
^/(\w+)/(\w+)/(\d+)/(\d+)/(\d+) /$1/$2/$3/$4_$5.png を永続的に書き換えます。

スクリプトロジック分析:

まず、URL の進化について考えてみましょう。http://baidu.com/index.php?user=admin&pass=123 => http://baidu.com/index.php/user/admin/pass/123 => http://baidu.com/index。次に、進化に応じて段階的に進めていきます。nginx の書き換えの通常の一致は、疑問符の後のパラメータと一致しないため、$arg_{パラメータ名} を使用してパラメータを保持する必要があります。また、一致ルールは疑問符で終わる必要があります。最後に、置き換える他のいくつかの項目と一致し、書き換えが完了します。

要約する

正規表現は難しくありません。よく使われるマッチングメタ文字はほんのわずかです。正規表現はソケットゲームとも言えますが、このゲームは非常に広く使われています。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx の if 文と正規表現を組み合わせて文字列を切り捨てる
  • nginx ロケーション設定の正規表現例の詳細な説明
  • Nginx 擬似静的書き換え通常リソースの概要
  • Nginx の書き換え正規マッチング書き換え方法の例
  • nginx 設定の場所の概要の場所の通常の書き込みと書き換えルールの書き込み
  • Pythonによるnginxアクセスログの定期分析
  • nginx で正規表現を使用してワイルドカードドメイン名を自動的に一致させる方法
  • nginx を使用して正規表現で指定された URL リクエストを傍受する方法
  • Nginx 正規表現関連のパラメータとルールの紹介

<<:  MySQLでMyISAMストレージエンジンをInnodbに変更した操作記録のまとめ

>>:  JavaScriptで継承を実装するいくつかの方法

推薦する

MySQLがフルテーブルスキャンを実行するいくつかの状況

目次ケース1:ケース2:ケース3:簡単にまとめると:過去 2 日間で、完全なテーブル スキャンを引き...

JavaScript の parseInt() の魔法についての簡単な説明

原因このブログを書いた理由は、今日Leetcodeの日課問題をやっていたからです。文字列を整数(at...

【HTML要素】タグテキストの詳細説明

1. 基本的なテキスト要素を使用してコンテンツをマークアップするまず表示効果を見てみましょう:対応す...

ドラッグ効果を実現するための js オブジェクト指向メソッド

この記事では、ドラッグアンドドロップをJSオブジェクト指向で実装するための具体的なコードを参考までに...

Docker の詳細なイラスト

1. Dockerの紹介1.1 仮想化1.1.1 仮想化とは何ですか?コンピュータにおける仮想化とは...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

デザイン理論:人間中心のグリーンデザイン

「人間中心」と「グリーンデザイン」という2つの視点から考える——デザイン業界の同僚とも議論する2つの...

MySQLで関連テーブルを削除する実用的な方法

MySQL データベースでは、テーブルが互いに関連付けられた後は、それらを任意に削除することはできま...

MySQL/MariaDB で完全な Unicode をサポートする方法

目次utf8mb4 の紹介UTF8 バイト数超過エラーutf8mb4 サポートデフォルトの文字エンコ...

Linux Zabbixカスタム監視およびアラーム実装プロセスの分析

ターゲットzabbix フロントエンド監視の iostat コマンドでデータの 1 つを表示します。...

HTML のテキストエリアの改行問題の概要

最近、Textrea に転送したときに、データが本当に行ごとに保存できるかどうかという問題に遭遇しま...

MySQL での varchar 型の日付の比較、並べ替え、その他の操作の実装

MySQL を使用する場合、日付は通常、datetime や timestamp などの形式で保存さ...

JavaScript DOM オブジェクト操作

目次1. コア1. Domノードを取得する2. ノードの更新2.1 実践演習3. Domノードを削除...

HTML タイトルに二重引用符を追加する方法

<a href="https://www.jb51.net/" title...

MYSQL の COLLATE とは何ですか?

序文MySQL で show create table <tablename> コマンド...