知識学習#
正規表現は強力なテキスト処理ツールであり、テキストの検索、置換、マッチング、分析を迅速に行うのに役立ちます。以下は基本的な正規表現の構文と例です:
基本文字マッチ#
a
:文字 "a" にマッチします。
例:正規表現a
は文字列 "apple" の最初の 'a' にマッチします。
ドット (.)#
.
:任意の単一の文字にマッチします(改行文字を除く)。
例:正規表現h.t
は "hat", "hot", "hit" などにマッチします。
アスタリスク (*)#
*
:前の文字にゼロ回以上マッチします。
例:正規表現ho*
は "h", "ho", "hoo", "hooo" などにマッチします。
プラス (+)#
+
:前の文字に 1 回以上マッチします。
例:正規表現ho+
は "ho", "hoo", "hooo" などにマッチしますが、"h" にはマッチしません。
クエスチョンマーク (?)#
?
:前の文字にゼロ回または 1 回マッチします。
例:正規表現ho?
は "h" と "ho" にマッチします。
文字クラス ([])#
[abc]
:角括弧内の任意の 1 文字(a、b、または c)にマッチします。
例:正規表現[ch]at
は "cat" と "hat" にマッチします。
除外文字クラス ([^])#
[^abc]
:角括弧内にない任意の文字にマッチします。
例:正規表現[^a]n
は "bn", "cn" などにマッチしますが、"an" にはマッチしません。
範囲指定 (-)#
[a-z]
:任意の小文字のアルファベットにマッチします。[A-Z]
:任意の大文字のアルファベットにマッチします。[0-9]
:任意の数字にマッチします。
例:正規表現[A-Z]at
は "Cat", "Hat" などにマッチしますが、"cat" にはマッチしません。
数字 (\d) と非数字 (\D)#
\d
:任意の数字にマッチし、[0-9]
と同等です。\D
:任意の非数字文字にマッチします。
例:正規表現\d\d
は "12", "45" などにマッチします。
単語文字 (\w) と非単語文字 (\W)#
\w
:任意の単語文字(アルファベット、数字、アンダースコアを含む)にマッチします。\W
:任意の非単語文字にマッチします。
例:正規表現\w\w
は "ab", "12", "a1" などにマッチします。
境界マッチ (\b と \B)#
\b
:単語の境界にマッチします。\B
:非単語の境界にマッチします。
例:正規表現\bcat\b
は "The cat sat." の "cat" にマッチしますが、"caterpillar" にはマッチしません。
エスケープ文字 (\)#
\\
:本来特別な意味を持つ文字(例:.
、*
、?
、+
など)にマッチするために使用します。
例:.
にマッチするには、正規表現\\.
を使用します。
アンカー (^ と $)#
^
:文字列の開始にマッチします。$
:文字列の終了にマッチします。
例:正規表現^cat
は "cat" と "caterpillar" にマッチしますが、"scatter" にはマッチしません。
グループ ( )#
( )
:複数の文字を 1 つのユニットにまとめるために使用し、|
演算子を使用してグループ化できます。
例:正規表現(ab|cd)
は "ab" または "cd" にマッチします。(?: )
:キャプチャしないグループを作成するために使用し、マッチした内容をキャプチャしません。
例:正規表現(?:ab|cd)
は "ab" または "cd" にマッチしますが、マッチした内容をキャプチャしません。|
:グループ内で論理和操作を作成し、2 つ以上のパターンの 1 つにマッチします。
例:正規表現a|b
は "a" または "b" にマッチします。- アサーションについては、以下を参照してください。
キャプチャグループとキャプチャグループ間の関係#
正規表現では、複数のキャプチャグループを連続して使用する場合、それらの間の関係は「順序かつ関係」(Sequential AND)です。これは、全体の式が成功するためには、各キャプチャグループが出現順にターゲット文字列内でマッチを見つける必要があり、各キャプチャグループのマッチ結果が前のキャプチャグループのマッチ結果の直後に続く必要があることを意味します。
例えば、正規表現 (A)(B)
を考えてみましょう:
- この式には 2 つのキャプチャグループがあります:
(A)
と(B)
。 - マッチが成功するためには、ターゲット文字列内で最初に
A
のマッチが出現し、その直後にB
のマッチが続く必要があります。 - この例では、文字列
AB
は成功裏にマッチします。なぜなら、最初にA
が含まれ、その直後にB
が続くからです。
ただし、キャプチャグループがアサーション内で使用される場合、例えば前方アサーション (?!...)
または (?=...)
の場合、キャプチャグループ内のマッチは文字を消費しません(つまり、正規表現エンジンの現在のマッチ位置を変更しません)。これは、アサーション内で使用されるキャプチャグループが同じ位置で複数の条件をチェックできることを意味し、必ずしも連続している必要はありません。例えば、正規表現 ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])
の 3 つの前方アサーションは、文字列の同じ開始位置で 3 つの条件をチェックします:少なくとも 1 つの数字、少なくとも 1 つの小文字、そして少なくとも 1 つの大文字。
したがって、キャプチャグループは通常「順序かつ関係」に従いますが、それらの相互作用は、特にアサーションに関与する場合、どのように使用されるかによっても異なります。
キャプチャグループの順序関係はどのように実現されるのか?#
正規表現におけるキャプチャグループの順序関係は、正規表現エンジンが左から右の順序で各式の部分を逐次評価することによって実現されます。このプロセスは通常、以下のステップを含みます:
-
マッチの開始:正規表現エンジンは文字列の開始位置または前回のマッチが終了した位置から検索を開始します。
-
逐次評価:エンジンは正規表現の最初の要素(文字、文字クラス、キャプチャグループ、アサーションなどの可能性があります)を読み取り、現在の位置でマッチを見つけようとします。成功した場合、エンジンはマッチした部分の後ろに移動し、次の要素を評価する準備をします。
-
前進を続ける:エンジンは順番に正規表現の次の要素を処理し、毎回マッチが成功するたびに前に進みます。
-
キャプチャグループの処理:エンジンがキャプチャグループに出会ったとき、キャプチャグループ内の式をマッチしようとします。キャプチャグループが成功裏にマッチした場合、マッチした内容は後で参照できるように保存されます。エンジンはその後、キャプチャグループの後の位置から前に進み、正規表現の残りの部分を処理します。
-
順序マッチ:正規表現エンジンは正規表現内の各要素を順番に処理するため、キャプチャグループ(および他の式の要素)間の順序関係が自然に形成されます。各キャプチャグループは、前のキャプチャグループのマッチ内容の後にマッチを見つける必要があり、「順序かつ関係」を実現します。
-
全体のマッチ成功または失敗:正規表現のすべての部分が順番に成功裏にマッチした場合、全体の式は成功裏にマッチします。どれか一つの部分が失敗した場合、全体のマッチ試行は失敗し、エンジンは文字列内の次の位置からプロセス全体を再開する可能性があります(正規表現の具体的な構造とマッチモードによります)。
このようにして、正規表現エンジンは式内のキャプチャグループ(および他の要素)がターゲット文字列内で出現順にマッチを見つける必要があることを保証し、それによってそれらの間の順序関係を実現します。
繰り返し記号 ({})#
{n}
:前の文字にちょうど n 回マッチします。{n,}
:前の文字に少なくとも n 回マッチします。{n,m}
:前の文字に少なくとも n 回マッチしますが、m 回を超えません。
例:正規表現a{2,4}
は "aa", "aaa" または "aaaa" にマッチします。
/s、/S、/t、/n#
\s
:任意の空白文字にマッチします。空白、タブ、改行などを含みます。\S
:任意の非空白文字にマッチします。\t
:タブにマッチします。\n
:改行にマッチします。
例:正規表現\s+
は 1 つ以上の空白文字にマッチします。
アサーション#
正規表現において、アサーションはマッチングプロセス中に特定の条件を定義するために使用され、文字を消費しません(つまり、文字列内の次の位置に進むことはありません)。アサーションは特定の位置でのチェックと見なすことができ、マッチが成功するかどうかを決定しますが、実際にマッチしたテキストの内容には影響を与えません。一般的なアサーションのタイプには以下が含まれます:
-
前方アサーション(Lookahead Assertion):前方アサーションは、特定の条件を満たすかどうかを判断するために、ある位置の後のテキストを確認します。正の前方アサーションと負の前方アサーションに分かれます。
- 正の前方アサーション (
(?=pattern)
):pattern
が現在の位置の後でマッチする場合にのみ、アサーションが成功します。例えば、q(?=u)
は "quiet" の "q" にマッチしますが、"Iraq" の "q" にはマッチしません。 - 負の前方アサーション (
(?!pattern)
):pattern
が現在の位置の後でマッチしない場合にのみ、アサーションが成功します。例えば、q(?!u)
は "Iraq" の "q" にマッチしますが、"quiet" の "q" にはマッチしません。
- 正の前方アサーション (
-
後方アサーション(Lookbehind Assertion):後方アサーションは、特定の条件を満たすかどうかを判断するために、ある位置の前のテキストを確認します。正の後方アサーションと負の後方アサーションに分かれます。
- 正の後方アサーション (
(?<=pattern)
):pattern
が現在の位置の前でマッチする場合にのみ、アサーションが成功します。例えば、(?<=\$)\d+
は "$100" の "100" にマッチしますが、"100 dollars" の "100" にはマッチしません。 - 負の後方アサーション (
(?<!pattern)
):pattern
が現在の位置の前でマッチしない場合にのみ、アサーションが成功します。例えば、(?<!\$)\d+
は "100 dollars" の "100" にマッチしますが、"$100" の "100" にはマッチしません。
- 正の後方アサーション (
-
単語境界アサーション (
\b
と\B
):文字が単語の境界にあるかどうかを判断するために使用されます。\b
:単語境界にマッチします。つまり、文字と非文字の間の位置です。例えば、\bword\b
は "word is" の "word" にマッチしますが、"swordfish" の "word" にはマッチしません。\B
:\b
の逆で、非単語境界にマッチします。
-
文字列開始と終了のアサーション (
^
と$
):これらのアサーションは、それぞれ文字列の開始と終了にマッチします。^
:文字列の開始にマッチします。例えば、^Hello
は "Hello" で始まる文字列にマッチします。$
:文字列の終了にマッチします。例えば、world$
は "world" で終わる文字列にマッチします。
アサーションは正規表現の非常に強力なツールであり、複雑な条件マッチを実行できるようにします。これは、パスワード検証、データ検証、テキスト分析など、複雑なテキストパターンを扱う際に非常に便利です。
アサーションが失敗した場合はどうなるか?#
アサーションが失敗するということは、現在のチェック位置でテキストがアサーションによって指定された条件を満たさないことを意味します。これにより、全体のパターンのマッチがその位置で失敗し、正規表現エンジンは新しい位置で再度マッチを試みる可能性があります。以下は、各種アサーションが失敗した場合の状況とその例です:
-
正の前方アサーションの失敗 (
(?=pattern)
):後のテキストがpattern
にマッチしない場合、アサーションは失敗します。- 例:正規表現
X(?=Y)
は、後にY
が続くX
にマッチすることを目的としています。文字列"XY"
では、X
の後にY
が続くため、X
にマッチします。しかし、文字列"XA"
では、X
の後にA
が続くため、アサーションは失敗し、マッチしません。
- 例:正規表現
-
負の前方アサーションの失敗 (
(?!pattern)
):後のテキストがpattern
にマッチする場合、アサーションは失敗します。- 例:正規表現
X(?!Y)
は、後にY
が続かないX
にマッチすることを目的としています。文字列"XA"
では、X
の後にY
が続かないため、X
にマッチします。しかし、文字列"XY"
では、X
の後にY
が続くため、アサーションは失敗し、マッチしません。
- 例:正規表現
-
正の後方アサーションの失敗 (
(?<=pattern)
):前のテキストがpattern
にマッチしない場合、アサーションは失敗します。- 例:正規表現
(?<=Y)X
は、前にY
があるX
にマッチすることを目的としています。文字列"YX"
では、X
の前にY
があるため、X
にマッチします。しかし、文字列"AX"
では、X
の前にA
があるため、アサーションは失敗し、マッチしません。
- 例:正規表現
-
負の後方アサーションの失敗 (
(?<!pattern)
):前のテキストがpattern
にマッチする場合、アサーションは失敗します。- 例:正規表現
(?<!Y)X
は、前にY
がないX
にマッチすることを目的としています。文字列"AX"
では、X
の前にY
がないため、X
にマッチします。しかし、文字列"YX"
では、X
の前にY
があるため、アサーションは失敗し、マッチしません。
- 例:正規表現
-
単語境界アサーションの失敗 (
\b
または\B
):\b
が単語境界を期待しているが実際にはその位置が単語境界でない場合、または\B
が非単語境界を期待しているが実際にはその位置が単語境界である場合、アサーションは失敗します。- 例(
\b
の失敗):正規表現\bword\b
は完全な単語 "word" にマッチすることを目的としています。文字列 "word is" では "word" にマッチしますが、文字列 "swordfish" では "word" の前後に単語境界がないため、\b
アサーションは失敗し、マッチしません。 - 例(
\B
の失敗):正規表現\Bis\B
は他の文字に囲まれた "is" にマッチすることを目的としています。文字列 "visit" では "is" にマッチしますが、文字列 "island" では "is" の前に単語境界があるため、\B
アサーションは失敗し、マッチしません。
- 例(
アサーションの失敗は、正規表現エンジンが現在の位置で全体のパターンに対するマッチを見つけられないことを意味します。正規表現の他の部分や具体的なエンジンの実装に応じて、エンジンは文字列内の他の位置から再度マッチを試みる可能性があります。
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(.{8,})$
この正規表現には 3 つのアサーションがあり、文字列の開始時に任意の値の後に数字、小文字、大文字がそれぞれ存在するかを自動的にマッチさせます。その後、.
は任意の値を示し、{8,}
は 8 文字以上を示します。
(?=.*\d)
は後に数字が 1 つ以上あることを示し、(?=.*[a-z])
は後に小文字が 1 つ以上あることを示し、(?=.*[A-Z])
は後に大文字が 1 つ以上あることを示します。
アサーションの境界はどこにあるのか?#
正規表現 ^(?=.*[A-Z])$
は、文字列に少なくとも 1 つの大文字が含まれていることを要求しているように見えますが、実際にはこの表現は文字を含む任意の文字列にマッチしません。これは、この表現の構造が論理的な矛盾を引き起こすためです。以下はこの表現の構成要素です:
-
^
と$
:これらの 2 つのシンボルはそれぞれ文字列の開始と終了を示します。これらが直接隣接している場合、間に何もないことを意味し、これは空の文字列に対応します。 -
(?=.*[A-Z])
:これは正の前方アサーションであり、現在の位置の後に少なくとも 1 つの大文字が存在することを要求します。このアサーション自体は文字を消費しません(つまり、マッチ位置を移動しません)。これは、アサーションが満たされる必要がある条件を設定します。
このアサーションと ^
および $
が組み合わさると、^(?=.*[A-Z])$
は実際には文字列が空である必要があることを要求します(なぜなら、^
と $
が直接接続しているため)、同時にその空の文字列のどこかに大文字が存在することを要求するため、これは明らかに満たすことができません。したがって、この正規表現は文字を含む任意の文字列にマッチしません。
少なくとも 1 つの大文字を含む文字列にマッチさせたい場合は、^
と $
の直接の接続を取り除き、正規表現が他の文字の存在を許可するようにする必要があります。例えば、^(?=.*[A-Z]).+$
のようにします。ここで .+
は少なくとも 1 つの任意の文字をマッチさせ、文字列が空でないことを保証し、(?=.*[A-Z])
は文字列に少なくとも 1 つの大文字が含まれていることを保証します。
単独の (?=.*[A-Z])
は正の前方アサーションであり、文字列に少なくとも 1 つの大文字が含まれているかどうかを確認します。このアサーション自体は任意の文字をマッチさせるものではなく、満たすべき条件を設定します。
では、(?=.*[A-Z]) は?#
この特定のアサーションでは:
(?= ... )
はアサーションの開始と終了を示し、これは検索操作であり、文字を消費しません。.*
は任意の数量の任意の文字(改行を除く)を示し、大文字が文字列の任意の位置に出現できることを示します。[A-Z]
は任意の大文字にマッチします。
(?=.*[A-Z])
を使用する場合、あなたは「現在の位置の後に、任意の数量の任意の文字の後に大文字が存在することを期待する」と言っていることになります。しかし、この表現は単なるアサーションであり、具体的にマッチさせる文字を指定していないため、実際のマッチを引き起こすことはありません。
このアサーションを意味のある正規表現にするためには、実際の文字列をマッチさせるための部分を追加する必要があります。例えば、少なくとも 1 つの大文字を含む任意の文字列にマッチさせたい場合、次のような表現を使用できます:
(?=.*[A-Z]).*
この表現では、.
は任意の単一の文字にマッチし、*
は前の要素のゼロ回以上のマッチを示します。したがって、.*
は任意の長さの任意の文字列をマッチさせ、少なくとも 1 つの大文字を含む文字列にマッチできることを保証します。
アサーションはどのように実行されるのか?#
アサーションはマッチする文字列の前提条件です!
正規表現 (?=.*[A-Z]).*
において、アサーション (?=.*[A-Z])
の実行プロセスは正規表現エンジンの動作方式に従います。このプロセスは大まかに以下のステップに分解できます:
-
エンジンが文字列の開始位置を特定する:正規表現エンジンは文字列の先頭から作業を開始します。
-
アサーションチェックを実行する:エンジンが
(?=.*[A-Z])
という正の前方アサーションに出会ったとき、現在の位置から後ろの文字列がアサーション内のパターン.*[A-Z]
を満たすかどうかを確認します。.*
は任意の数量の任意の文字(改行を除く)を示し、これにより大文字[A-Z]
は文字列の任意の位置に出現できることを示します。[A-Z]
は任意の 1 つの大文字にマッチします。
-
アサーションの成功と失敗:
- もしも 現在の位置から始まる文字列に少なくとも 1 つの大文字が存在する場合、アサーションは成功します。たとえその大文字が現在の位置にない場合でも、
.*
は大文字の前に任意の数量の任意の文字を許可します。 - アサーションが成功した場合、エンジンは正規表現の他の部分を続けて実行しますが、マッチ位置は元の開始位置に留まります。なぜなら、前方アサーションは文字を消費しないからです。
- もしも現在の位置から始まる文字列に大文字が存在しない場合、アサーションは失敗し、全体の式のマッチ試行はこの開始位置で失敗します。エンジンは文字列の次の位置から再度マッチを試みる可能性があります(これは正規表現の具体的な使用方法と文脈によります)。
- もしも 現在の位置から始まる文字列に少なくとも 1 つの大文字が存在する場合、アサーションは成功します。たとえその大文字が現在の位置にない場合でも、
-
.*
の処理:アサーションが成功した場合、正規表現エンジンは次に.*
部分に出会います。- これは、現在の位置(つまり文字列の開始位置)から始まる任意の数量の任意の文字をマッチします。文字列の末尾まで。
- これは、アサーションが成功した場合、全体の表現
(?=.*[A-Z]).*
が文字列全体にマッチすることを意味します。なぜなら、.*
が現在の位置から文字列の末尾までのすべての文字を含むことを保証するからです。
要するに、アサーション (?=.*[A-Z])
は正規表現 (?=.*[A-Z]).*
の中で少なくとも 1 つの大文字を含むことを保証する前提条件の役割を果たし、.*
はその条件を満たす全体の文字列を実際にマッチさせる役割を果たします。
テスト問題#
正規表現を練習できるウェブサイト - Regex101
以下は正規表現の練習問題で、正規表現の基本構文の理解を深めるのに役立ちます:
-
単純な数字にマッチ
前導ゼロなしの任意の正の整数にマッチする正規表現を作成します。
\d+
-
電子メールアドレスの検証
^[\w]+@[A-Za-z0-9]+.[A-Za-z]+$
"@" と "." を含み、"@" が "." の前に出現する単純な電子メールアドレスを検証する正規表現を作成します。
^[\w.-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$
この正規表現の各部分の説明:^
:文字列の開始を示します。[\w.-]+
:1 つ以上のアルファベット数字文字、アンダースコア、ドット、またはハイフンにマッチします。この部分は電子メールアドレスのユーザー部分にマッチします。@
:電子メールアドレスに "@" が含まれることを保証します。[A-Za-z0-9.-]+
:1 つ以上のアルファベット、数字、ドット、またはハイフンにマッチします。この部分は電子メールアドレスのドメイン部分にマッチします。\.
:電子メールアドレスに "." が含まれることを保証します。[A-Za-z]{2,}
:2 文字以上のアルファベットにマッチします。この部分は通常、トップレベルドメインにマッチします。$
:文字列の終了を示します。
-
URL マッチ
標準の HTTP または HTTPS URL にマッチする正規表現を作成します。URL は http:// または https:// で始まり、ドメイン名とパスを含むことができます。
^http[s]*:\/\/[\w]+.[\w]{2,}+(\/[\w]*|)$
^https?:\/\/[\w.-]+\.[\w]{2,}(\/[\w\/.-]*)?$
^
:文字列の開始を示します。https?
:s
の後の?
はs
がオプションであることを示し、http
とhttps
の両方にマッチします。:\/\/
: "://" にマッチします。スラッシュは正規表現内でエスケープする必要があるため、\\
を使用しています。[\w.-]+
:1 つ以上のアルファベット数字文字、アンダースコア、ドット、またはハイフンにマッチします。ドメイン名の一部にマッチします。\.
:ドメイン名の各部分を区切るためのドット文字で、エスケープする必要があります。[\w]{2,}
:2 文字以上のアルファベット数字文字にマッチし、トップレベルドメインに使用されます。(\/[\w\/.-]*)?
:これはキャプチャグループで、URL のパス部分にマッチします。\/
はスラッシュ(パスの開始)にマッチし、[\w\/.-]*
はパス内のアルファベット数字文字、スラッシュ、ドット、またはハイフンにマッチします。全体のグループはオプションで、最後の?
で示されます。$
:文字列の終了を示します。
-
日付形式の検証
"YYYY-MM-DD" 形式の日付にマッチする正規表現を作成します。年は 4 桁の数字、月と日は 2 桁の数字です。
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$
^
:文字列の開始を示します。\d{4}
:4 桁の数字にマッチし、年を示します。-
:日付の各部分の区切り文字を示します。(0[1-9]|1[0-2])
:これはキャプチャグループで、01 から 09 月と 10 から 12 月にマッチします。0[1-9]
は 01 から 09 に、1[0-2]
は 10 から 12 にマッチします。-
:再度、日付の各部分の区切り文字を示します。(0[1-9]|[12][0-9]|3[01])
:これは別のキャプチャグループで、月の日にマッチします。0[1-9]
は 01 から 09 日、[12][0-9]
は 10 から 29 日、3[01]
は 30 と 31 日にマッチします。$
:文字列の終了を示します。
-
携帯電話番号の検証
"1" で始まり、合計 11 桁の数字である単純な携帯電話番号を検証する正規表現を作成します。
1[\d]{10}
-
IP アドレスのマッチ
標準の IPv4 アドレスにマッチする正規表現を作成します。各オクテットは 0 から 255 の間の数字で、4 つのオクテットは "." で区切られます。
(25[0-5]|[0-1][0-9][0-9]|2[0-4][0-9])(.(25[0-5]|[0-1][0-9][0-9]|2[0-4][0-9])){3}
-
HTML タグのマッチ
<div>
や<a href="...">
のような単純な HTML タグにマッチする正規表現を作成します。タグ名は任意のアルファベットの組み合わせです。
<([a-zA-Z]+)(\s+[a-zA-Z]+="[^"]*")*\s*>
特殊文字を含む属性値を持つdata-attribute
を持つ<a>
タグの例を考えます。以下のようなタグがあります:<a href="/example" data-attribute="{\"key\": \"value\"}" class="link">
この例では:
-
<[\w\/\s\+\=\"\']+>
の正規表現は、属性値内の{
,}
,:
などの特殊文字がこの表現で定義された文字セットに含まれていないため、タグ全体を正しくマッチできない可能性があります。これにより、最初に出会った特殊文字でマッチが中断される可能性があります。 -
<([a-zA-Z]+)(\s+[a-zA-Z]+="[^"]*")*\s*>
の正規表現は、属性値が特殊文字を含む場合でも、属性が属性="値"
の形式で空白で区切られていることを特に探すため、全体のタグをより効果的にマッチさせることができます。この表現は、ダブルクオートで囲まれた値内の具体的な内容には関心を持たず、属性値内に{
,}
,:
, または他の任意の文字が含まれることを許可します。
したがって、最初の正規表現はより広範で柔軟ですが、複雑な属性値を処理する際に問題が発生する可能性があります。2 番目の正規表現は、属性構造をより厳密に定義することにより、特に特殊文字を含む属性値を処理する際に、より安定して正確なマッチを提供します。
両者の違いは、属性内で^"
を使用しているため、属性内の特殊文字をマッチできるようになりますが、Vue では@
記号もあるため、この正規表現はまだ完全ではありません。 -
-
パスワード強度の検証
パスワードの強度を検証する正規表現を作成します。パスワードは、少なくとも 1 つの数字、1 つの大文字、1 つの小文字を含む必要があり、全体の長さは少なくとも 8 文字である必要があります。
パスワードの強度を検証するための正規表現を作成するには、次のような正規表現を使用できます:^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}$
この表現の各部分の説明:
^
:文字列の開始を示します。(?=.*\d)
:これは前方アサーションで、文字列に少なくとも 1 つの数字が含まれていることを確認します。.
は任意の文字(改行を除く)にマッチし、*
はゼロ回以上の文字にマッチし、\d
は数字文字を示します。(?=.*[a-z])
:これは別の前方アサーションで、文字列に少なくとも 1 つの小文字が含まれていることを確認します。[a-z]
は任意の小文字にマッチします。(?=.*[A-Z])
:これは 3 つ目の前方アサーションで、文字列に少なくとも 1 つの大文字が含まれていることを確認します。[A-Z]
は任意の大文字にマッチします。.{8,}
:.
は任意の文字(改行を除く)にマッチし、{8,}
は前の文字が少なくとも 8 回マッチすることを示します。$
:文字列の終了を示します。
この正規表現は、前方アサーションを使用して各必須文字タイプ(数字、小文字、大文字)を独立してチェックし、
.{8,}
を使用してパスワードの全体の長さが少なくとも 8 文字であることを保証します。注意すべき点は、この表現はパスワードの最大長を制限せず、パスワードに任意の文字が含まれることを仮定していることです。条件を満たす限り、数字、1 つの大文字、1 つの小文字が含まれている必要があります。 -
コードコメントのマッチ
"//" で始まる JavaScript または C スタイルの単一行コメントにマッチする正規表現を作成します。
JavaScript または C スタイルの単一行コメント、つまり "//" で始まり行末までのコメントにマッチするには、次の正規表現を使用できます:^\/\/.*
この表現の構成要素の説明:
^
:これは文字列の開始を示します。テキストの任意の位置でコメントをマッチさせたい場合は、このシンボルを削除します。\/\/
:/
は正規表現内で特殊文字であるため、エスケープする必要があります。したがって、\/\/
はテキスト内の "//" 文字列にマッチします。.*
:これは "//" の後に任意の数量の任意の文字(改行を除く)にマッチします。
この正規表現を使用する際の注意点:
- この表現を全体検索に使用する場合、各行の先頭からマッチする必要がない場合は、
^
を削除します。 - この表現は、コメントが改行を含まないことを前提としています。コメントが複数行にわたる場合(これは通常の単一行コメントの定義には合致しません)、この表現は適用できません。
- 一部の正規表現処理器では、任意の文字をマッチさせるために異なるシンボルやモードフラグを使用する必要がある場合があります。これは使用するツールや言語によって異なります。
-
ファイルパスのマッチ
アルファベット、数字、スラッシュ/
、およびドット.
を含む Unix スタイルのファイルパスにマッチする正規表現を作成します。
^[\/\w.]+$
オンラインの正規表現テストツール、例えば Regex101 を使用して、これらの問題を練習し、解決策をテストできます。