正規表現
紹介
正規表現(Regular Expression)は、テキストパターンであり、通常文字(例えば英字の a から z までの文字)と特殊文字(「メタ文字」と呼ばれる)を含み、文字列の特定のパターンを記述・一致させるために使用します。
正規表現は、パターンマッチングとテキスト検索に用いられるツールです。
正規表現は、テキストデータの検索・置換・検証・抽出を行う柔軟で強力な方法を提供します。
正規表現は、JavaScript、Python、Java、Perl など、さまざまなプログラミング言語やテキスト処理ツールに応用できます。
// 从字符串 str 中提取数字部分的内容(匹配一次):var str = "abc123def";var patt1 = /[0-9]+/;document.write(str.match(patt1));オンラインツール
正規表現のパターン
正規表現のパターンは以下の内容を含むことができます:
- リテラル文字:例えば文字、数字、空白など、それらを自身と直接一致させます。
- 特殊文字:例えばドット .、アスタリスク *、プラス記号 +、クエスチョンマーク ? など、それらには特別な意味と機能があります。
- 文字クラス:角括弧 [] で囲まれた文字集合で、括弧内のいずれかの文字と一致させます。
- メタ文字:例えば \d、\w、\s など、数字、英字・数字・アンダースコア、空白文字などの特定のタイプの文字に一致させます。
- 量詞:例えば {n}、{n,}、{n,m} など、マッチの回数や範囲を指定します。
- 境界記号:例えば ^、$、\b、\B など、文字列の先頭・末尾・単語境界の位置に一致させます。
簡介
正規表現の使用は、単純な方法で強力な機能を実現します。以下に、簡単な例を挙げます。

^は入力文字列の開始位置に一致します。[0-9]+は複数の数字に一致します。[0-9]は単一の数字に一致し、+は1回以上を意味します。abc$は文字列の末尾がabcで終わることに一致します。$は入力文字列の終端位置に一致します。
私たちがユーザー登録フォームを書くとき、ユーザー名に含まれてよい文字を「文字、数字、アンダースコア、ハイフン」に限定し、長さを設定する場合、以下の正規表現を用いて設定できます。
^[a-zA-Z0-9_-]{3,15}$- ^ は文字列の先頭を表します。
- [a-zA-Z0-9_-] は文字集合を表し、小文字アルファベット、大文字アルファベット、数字、アンダースコア、ハイフンを含みます。
- {3,15} は前の文字集合が最小3回、最大15回出現することを意味し、ユーザー名の長さを3〜15文字に制限します。
- $ は文字列の末尾を表します。
正規表現元字符と特性
- 文字マッチ
- 普通文字:普通文字は文字通りにマッチします。例えば文字 “a” にマッチすると、テキスト中の “a” に一致します。
- メタ文字:メタ文字は特殊な意味を持ちます。例えば \d は任意の数字、\w は英数字とアンダースコア、. は改行を除く任意の文字などです。
- 量詞
- *:前のパターンを0回以上マッチします。
- +:前のパターンを1回以上マッチします。
- ?:前のパターンを0回または1回マッチします。
- {n}:前のパターンをちょうど n 回マッチします。
- {n,}:前のパターンを少なくとも n 回マッチします。
- {n,m}:前のパターンを少なくとも n 回、最大で m 回マッチします。
- 文字クラス
- [ ]:括弧内の任意の1文字に一致します。例えば [abc] は ‘a’、‘b’、または ‘c’ に一致します。
- [^ ]:括弧内の文字以外の任意の1文字に一致します。
- 境界マッチ
- ^:文字列の先頭に一致します。
- $:文字列の末尾に一致します。
- \b:単語境界に一致します。
- \B:非単語境界に一致します。
- グループ化とキャプチャ
- ( ):グループ化とサブ式のキャプチャに使用します。
- (?: ):キャプチャを行わずにグループ化する非捕獲グループです。
- 特殊文字
- \:特殊文字自体をマッチさせるためのエスケープ文字です。
- .:改行を除く任意の1文字にマッチします。
- |:複数のパターンのいずれかを選択します。
为什么使用正则表达式?
典型的な検索・置換操作では、期待する検索結果と厳密に一致するテキストを提供する必要があります。この技術は静的なテキストに対しては簡単な検索・置換タスクには十分かもしれませんが、柔軟性に欠け、動的なテキストを検索するときは困難になります。
正規表現を使用することで、次のことが可能になります:
- 文字列内のパターンをテストする。 例えば、入力文字列に電話番号パターンやクレジットカード番号パターンが現れるかを検証します。これをデータ検証と呼びます。
- テキストを置換する。 正規表現を用いて文書内の特定のテキストを識別し、そのテキストを完全に削除するか、別のテキストに置換します。
- パターンマッチに基づいて文字列からサブ文字列を抽出する。 文書内や入力フィールド内の特定のテキストを探します。
例えば、サイト全体を検索して古い素材を削除し、いくつかの HTML フタグを置換する必要がある場合、正規表現を用いてファイルごとにその素材や HTML フタグが現れるかを特定できます。これにより、対象ファイルのリストを削減し、次に正規表現を使って古い素材を削除します。最後に、正規表現を使ってタグを検索・置換します。
アプリケーション領域
現在、正規表現は多くのソフトウェアで広く利用されています。Unix系(Linux、Unix など)、HP などのオペレーティングシステム、PHP、C#、Java などの開発環境、および多くのアプリケーションソフトウェアに正規表現の影子を見ることができます。
| コマンドや環境 | . | [ ] | ^ | $ | ( ) | { } | ? | + | | | ( ) | | ---------- | - | --- | - | - | ----- | -------------------------------------------------------------------------------- | - | - | - | --- | | vi | √ | √ | √ | √ | √ | | | | | | | Visual C++ | √ | √ | √ | √ | √ | | | | | | | awk | √ | √ | √ | √ | | awkは支持该语法,只是在命令行加入 —posix or —re-interval 参数即可,可见man awk中的interval expression | √ | √ | √ | √ | | sed | √ | √ | √ | √ | √ | √ | | | | | | delphi | √ | √ | √ | √ | √ | | √ | √ | √ | √ | | python | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | | java | √ | √ | √ | √ | √ | √ | √ | √ | √ | √ | | javascript | √ | √ | √ | √ | √ | | √ | √ | √ | √ | | php | √ | √ | √ | √ | √ | | | | | | | perl | √ | √ | √ | √ | √ | | √ | √ | √ | √ | | C# | √ | √ | √ | √ | | | √ | √ | √ | √ |
正規表現 - 语法
正規表現は、テキストをマッチさせたり操作したりする強力なツールであり、文字列パターンを記述する一連の文字と特殊文字から成るパターンです。
正規表現は、テキスト中の特定のパターンを検索・置換・抽出・検証するために使用できます。
正規表現を構築する方法は、数学的式を作成する方法と同じです。さまざまなメタ文字と演算子を組み合わせて、より大きな表現を作成することができます。正規表現の構成要素は、単一の文字、文字集合、文字範囲、文字間の選択、またはこれらの要素の任意の組み合わせで構成されることがあります。
正規表現は、普通文字(例:a から z の文字)と特殊文字(「メタ文字」と呼ばれる)で構成されるリテラルなパターンです。パターンは、検索テキスト時に一致させるべき1つ以上の文字列を記述します。正規表現はテンプレートとして機能し、特定の文字パターンと検索対象の文字列を照合します。
普通文字
普通文字には、メタ文字として明示的に指定されていないすべての可視・不可視文字が含まれます。これには、すべての大文字・小文字の英字、すべての数字、すべての句読点、その他の記号が含まれます。
[ABC]- 複合クラス内のすべての文字に一致します。例えば、[aeiou] は文字列 “google runoob taobao” の中の e、o、u、a の文字すべてに一致します。
[^ABC]- 複合クラス内の文字を除くすべての文字に一致します。例えば、[^aeiou] は文字列 “google runoob taobao” の中の e、o、u、a 以外のすべての文字に一致します。
[A-Z]- [A-Z] は1つのレンジを表し、大文字アルファベット全体に一致します。
[a-z]は小文字全体を表します。
- [A-Z] は1つのレンジを表し、大文字アルファベット全体に一致します。
.- 改行文字(\n、\r)を除く任意の1文字に一致します。これは [^\n\r] と同等です。
[\s\S]- すべてに一致します。 \s は空白文字全体に、改行を含み、\S は非空白文字で、改行を含みません。
\w- 英字・数字・アンダースコアに一致します。等価には [A-Za-z0-9_]。
\d- アラビア数字(0 から 9)に一致します。等価には [0-9]。
非表示文字
非表示文字も正規表現の構成要素として現れ得ます。下表は不可視文字を表すエスケープシーケンスを示します:
| 字符 | 描述 |
|---|---|
| \cx | x が指示する制御文字に一致します。例えば、 \cM はコントロール文字の M またはキャリ回車を示します。x の値は A-Z または a-z のいずれかでなければなりません。そうでない場合、c はリテラルの ‘c’ 文字として解釈されます。 |
| \f | 改ページに一致します。等価は \x0c および \cL。 |
| \n | 改行に一致します。等価は \x0a および \cJ。 |
| \r | キャリレーターに一致します。等価は \x0d および \cM。 |
| \s | 任意の空白文字に一致します。空白文字、タブ、改ページなどを含みます。等価は [ \f\n\r\t\v]。Unicode 正規表現は全角スペースにもマッチします。 |
| \S | 非空白文字に一致します。等価は [^ \f\n\r\t\v]。 |
| \t | タブ文字に一致します。等価は \x09 および \cI。 |
| \v | 垂直タブに一致します。等価は \x0b および \cK。 |
特殊字符
いわゆる特殊文字とは、上記の runoob のように特別な意味を持つ文字のことです。単純に言えば、任意の文字列を表すことがあります。文字列中の '' 記号を検索する場合は、エスケープする必要があります。つまり、“runo*ob” は「runo*ob」という文字列に一致します。
多くのメタ文字は、マッチさせる際に特別扱いが必要です。これらの特殊文字をマッチさせたい場合は、まず文字を「エスケープ」します。つまり、バックスラッシュ \ を前に置きます。以下の表は正規表現での特殊文字を列挙します:
| 特別字符 | 描述 |
|---|---|
| $ | 入力文字列の末尾位置に一致します。RegExp オブジェクトの Multiline 属性が設定されている場合、 は '\n' または '\r' にも一致します。\ 自身を文字として一致させるには \$ を使用します。 |
| ( ) | サブ表現の開始と終了位置を示します。サブ表現は後で使用できます。これらの文字をマッチさせたい場合は \( と \) を使用します。 |
| - | 前のサブ表現を0回または多回マッチさせます。* 字符をマッチさせたい場合は \* を使用します。 |
| + | 前のサブ表現を1回以上マッチさせます。+ 字符をマッチさせたい場合は \+ を使用します。 |
| . | 改行を除く任意の1文字にマッチします。. をマッチさせたい場合は \. を使用します。 |
| [ | 中括弧表現の開始を示します。\[ をマッチさせたい場合は使用します。 |
| ? | 前のサブ表現を0回または1回マッチさせるか、非貪欲な限定子を指定します。? をマッチさせたい場合は \? を使用します。 |
| \ | 次の文字をエスケープしたり、特殊文字・リテラル文字・後方参照・8進エスケープとして機能させます。例として、‘n’ は文字 ‘n’ に、‘\n’ は改行に一致します。シーケンス ’\\’ は "" に、’\(’ は ”(” に一致します。 |
| ^ | 入力文字列の開始位置に一致します。角括弧内で使用されていない限り、または角括弧表現内でこの記号が使用される場合、文字集合を受け付けません。^\ の自体をマッチさせたい場合は \^ を使用します。 |
| { | 限定子表現の開始を示します。{ をマッチさせたい場合は { を使用します。 |
| | | 2つの項の間の選択を指定します。 |
限定符
限定符は、正規表現の特定の要素がマッチするために何回現れるべきかを指定します。* や + や ? や {n} や {n,} や {n,m} の6種類があります。
正規表現の限定符は:
- *
前のサブ表現を0回以上マッチします。例えば、zo* は “z” あるいは “zoo” にマッチします。_ は {0,} に相当します。 - +
前のサブ表現を1回以上マッチします。例えば、zo+ は “zo” あるいは “zoo” にマッチします。+ は {1,} に相当します。 - ?
前のサブ表現を0回または1回マッチします。例えば、do(es)? は “do”、“does”、“doxy” の “do” と “does” にマッチします。? は {0,1} に相当します。 - {n}
n は非負整数。前のパターンをちょうど n 回マッチします。例えば、o{2} は “Bob” の中の “oo” にはマッチしませんが、“food” の中の “oo” にはマッチします。 - {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 にマッチします。o{0,1}は o? に相当します。カンマの後の数値同士の間にはスペースを入れないでください。
- と + の限定符は共に貪欲です。可能な限り多くの文字とマッチします。これに対して、後ろに ? を付けると非貪欲(最小マッチ)になります。
定位符
定位符(アンカー)は、正規表現を行の先頭または末尾に固定するために使用します。また、単語内、単語の先頭、あるいは単語の末尾に現れるような正規表現を作成することも可能にします。
定位符は文字列や単語の境界を記述します。^ と $ はそれぞれ文字列の開始と終了を示し、\b は単語の前後の境界、\B は非単語境界を表します。
正規表現の定位符は:
- ^
入力文字列の開始位置に一致します。RegExp オブジェクトの Multiline 属性が設定されている場合、^ は \n や \r の後の位置にも一致します。 - $
入力文字列の末尾位置に一致します。RegExp オブジェクトの Multiline 属性が設定されている場合、$ は \n や \r の前の位置にも一致します。 - \b
単語境界に一致します。すなわち、単語と空白の間の位置です。 - \B
非単語境界に一致します。
選択
丸括弧 () で全ての選択肢を囲み、隣接する選択肢は | で区切ります。
() はキャプチャグループを表し、各グループ内の一致した値を保存します。複数のマッチ値は数字 n で参照できます(n は数字で、n 番目のキャプチャグループの内容を指します)。
ただし丸括弧を使うと副作用として関連するマッチがキャッシュされます。この副作用を解消するには、先頭に ?: を付けて非キャプチャにします。
?: は非捕獲元の1つで、他にも ?= および ?! という2つの非捕獲元があります。これらにはさらに意味があり、前者は正向先読みで、先にマッチする正規表現パターンの位置で検索文字列をマッチさせます。後者は後方先読みで、マッチしていない正規表現パターンの位置で検索文字列をマッチさせます。
以下は ?=、?<=、?!、?<! の使用区別です。
- exp1(?=exp2):exp2 の前の exp1 を探します。
- (?<=exp2)exp1:exp2 の後の exp1 を探します。
- exp1(?!exp2):exp2 でない後ろの exp1 を探します。
- (?<!exp2)exp1:exp2 でない前の exp1 を探します。
反向引用
正規表現のパターンまたは部分パターンの両側に括弧を追加すると、関連するマッチが一時バッファに格納されます。捕捉された各サブマッチは、正規表現パターンの左から右へ現れる順序で格納されます。バッファ番号は1から始まり、最大99個の捕捉サブ表現を格納できます。各バッファには \n でアクセスできますが、n は特定のバッファを識別する1桁または2桁の十進数です。
非捕獲元?:、?=、?! を使用して、キャプチャを回避し、対応するマッチを保存しないように書き換えることができます。
後方参照の最も基本的で有用な応用の1つは、テキスト内の2つの同じ隣接する単語をマッチさせる機能を提供することです。
Is is the cost of of gasoline going up up?
上の文には明らかに複数の繰り返し単語があります。この文を特定する方法を設計して、各単語の繰り返しを1つずつ探さなくてもよいとしたら、どれだけいいでしょう。以下の正規表現は、単一のサブ表現を使ってこれを実現します:
// 查找重复的单词:var str = "Is is the cost of of gasoline going up up";var patt1 = /\\b([a-z]+) \\1\\b/igm;document.write(str.match(patt1));捕捉された表現は、[a-z]+ が指定するように、1つ以上の文字を含みます。正規表現の第二部は、以前に捕捉されたサブマッチの参照であり、単語の2つ目のマッチはちょうど括弧式に一致します。\1 は最初のサブマッチを指定します。
単語境界メタ文字は、単語全体のみを検出することを保証します。そうでない場合、“is issued” や “this is” のような語句は、この式では正しく認識されません。
正規表現の後ろにつく global 修飾子 g は、この式を入力文字列に適用して、可能な限り多くの一致を見つけることを指定します。
式の末尾の i 修飾子は、大文字・小文字を区別しないことを指定します。
multiline 修飾子 m は、改行文字の両側に潜在的なマッチが現れることを指定します。
反向引用はまた、一般的な URI 指定子を分解して成分にします。以下の URI を、プロトコル(ftp、http など)、ドメイン、ページ/パスに分解したいとします:
https://www.runoob.com:80/html/html-tutorial.html
以下の正規表現はこの機能を提供します:
// 输出所有匹配的数据:var str = "<https://www.runoob.com:80/html/html-tutorial.html>";var patt1 = /(\\w+):\\/\\/([^/:]+)(:\\d*)?([^# ]*)/;arr = str.match(patt1);for (var i = 0; i < arr.length ; i++) { document.write(arr[i]); document.write("<br>");}第三行代码 str.match(patt1) は配列を返します。例の配列には5つの要素が含まれ、インデックス 0 は全体の文字列、インデックス 1 は最初のマッチ(括弧内)に対応します。以降も同様です。
最初の括弧のサブ表現は Web アドレスのプロトコル部分をキャプチャします。このサブ表現はコロンと2つのスラッシュの前の任意の単語に一致します。
2番目の括弧のサブ表現は住所のドメイン部分をキャプチャします。サブ表現は「:」と「/」の後ではない、1つ以上の文字に一致します。
3番目の括弧のサブ表現はポート番号をキャプチャします(指定されている場合)。このサブ表現はコロンの後の0個以上の数字に一致します。これを1回だけ繰り返します。
最後に、4番目の括弧のサブ表現は Web アドレスが指定するパスと/またはページ情報をキャプチャします。このサブ表現は「#」または空白文字を含まない任意の文字列に一致します。
正規表現を上記の URI に適用すると、各サブマッチには以下が含まれます:
- 最初の括弧のサブ表現には
https - 2 番目の括弧のサブ表現には
www.runoob.com - 3 番目の括弧のサブ表現には
:80 - 4 番目の括弧のサブ表現には
/html/html-tutorial.html
正規表現 - 修飾符(マーク)
マークは修飾子とも呼ばれ、正規表現のマークは追加のマッチング戦略を指定します。
マークは正規表現の内部には書かず、式の外部に配置します。形式は次のとおりです:
/pattern/flags下表は、正規表現でよく使われる修飾子を示します:
| 修飾子 | 含意 | 説明 |
|---|---|---|
| i | ignore-不区分大小写 | 大文字小文字を区別せずにマッチさせます。検索時に大文字と小文字を区別しません。A と a は区別されません。 |
| g | global-全局マッチ | すべての一致を見つけます。 |
| m | multi line-多行マッチ | ^ と $ の境界文字を、それぞれ各行の先頭と末尾にマッチさせます。全体文字列の先頭・末尾ではなく、多行の先頭末尾を指します。 |
| s | 特殊文字ドット.に改行 \n を含む | デフォルトではドット . は改行を除く任意の文字にマッチします。s 修飾子を付けると . が改行も含むようになります。 |
正規表現 - 運算子の優先順位
正規表現は左から右へ計算され、優先順位の順序に従います。これは算術式と非常に似ています。
同じ優先順位のものは左から右へ計算され、異なる優先順位の計算は上位から下位へと進みます。以下の表は、最高位から最低位までの各正規表現演算子の優先順位を説明します:
| 演算子 | 説明 |
|---|---|
\\ | エスケープ |
(), (?:), (?=), [] | 丸括弧と角括弧 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \\ any metacharacter、any character | 定位点とシーケンス(位置と順序) |
以下は、よく使われる正規表現演算子を優先順位の高い順から順に並べたものです:
- エスケープ符号: \ は他の特殊文字をエスケープするためのエスケープ符号です。最高の優先順位を持ちます。
- 括弧: 丸括弧 () はサブ表現を作成するために使用され、他の演算子より高い優先順位を持ちます。
- 量詞: 量詞は前の要素が繰り返される回数を指定します。
- 文字クラス: 文字クラスは [] で表され、括弧内の任意の文字に一致します。
- アサーション: 断言は、文字列の特定の位置の条件を検査する要素です。
- 連結: 連結は、他の演算子がない場合、文字間の単純な結合を表します。
- パイプライン: パイプ記号 | は「または」の関係を表し、複数のパターンの中から1つを選択します。
正規表現 - マッチング規則
基本パターンマッチ
パターンは正規表現の最も基本的な要素であり、文字列の特徴を記述する文字の集合です。パターンは、単純な文字列から成ることもあれば、非常に複雑で、特殊文字を用いて特定の範囲内の文字、繰り返し、あるいは文脈を表すこともあります。
文字簇
INTERNET のプログラムでは、正規表現は通常、ユーザーの入力を検証するために使用されます。ユーザーがフォームを送信した後、入力された電話番号、住所、EMAIL アドレス、クレジットカード番号などが有効かどうかを判断するには、通常のリテラル文字だけでは足りません。
そこで、求めるパターンをより自由に表現する方法として、文字簇を用います。
確定的な繰り返し
ここまでで、1文字または数字をマッチさせる方法は分かりましたが、多くの場合、単語や数字の列をマッチさせる必要があります。単語は複数の文字で構成され、数字の列は複数の数字で構成されます。文字または文字簇の後に続く波括弧({})は、前の内容が繰り返される回数を決定します。
この記事が役に立ったときは、ぜひ他の人に共有してください!
一部の情報は古い可能性があります





