81. 正規表現

I. 概要

正規表現は、テキスト コンテンツの検索と置換に使用されます。

正規表現は他の言語やソフトウェア製品に組み込まれているものであり、言語やソフトウェア自体ではありません。

正規表現オンラインツール

次に、単一の文字と一致します

.は任意の 1 文字と一致するために使用できますが、ほとんどの実装では改行文字と一致することはできません。

.はメタキャラクターであり、文字自体の意味ではなく、特別な意味を持つことを意味します。. と一致する必要がある場合は、 \ を使用してエスケープします。つまり、 の前に \ を追加します。

正規表現では通常、大文字と小文字が区別されますが、一部の実装では区​​別されません。

正規表現

C.C2018

マッチング結果

CyC2018と申します

3. 一連の文字を照合する

[ ] は文字セットを定義します。

0 ~ 9、az は文字間隔を定義します。間隔は ASCII コードによって決定され、文字間隔は [ ] 内に使用されます。

- [ ] の間のみがメタ文字であり、[ ] の外側は通常の文字です。

^は [ ] 内の否定演算です。

応用

abc で始まり数字で終わらない文字列と一致します。

正規表現

abc[^0-9]

マッチング結果

  1. あいうえお
  2. abc1
  3. abc2

4. メタキャラクターを使用する

空白文字と一致する

メタキャラクター 説明する
[\b] 1文字戻る(削除)
\f フォームフィード
\n 改行
\r キャリッジリターン
\t タブ
\v 垂直タブ

\r\n は Windows では行末ラベルであり、Unix/Linux では \n です。

\r\n\r\n Windows では空行と一致します。これは、連続する 2 つの行末ラベル (まさに 2 つのレコード間の空行) と一致するためです。

特定の文字に一致する

1. 数値メタキャラクター

メタキャラクター 説明する
\d [0-9] に相当する数字
\D 数字以外の文字、[^0-9] と同等

2. 英数字のメタキャラクター

メタキャラクター 説明する
\w 大文字と小文字、アンダースコアと数字、[a-zA-Z0-9_] と同等
\W \w を否定します

3. 空白類のメタキャラクター

メタキャラクター 説明する
\s [\f\n\r\t\v] に相当する任意の 1 つの空白文字
\S \s を否定する

\x は 16 進文字に一致し、\0 は 8 進文字に一致します。たとえば、\xA は、値が 10 の ASCII 文字、つまり \n に対応します。

5、マッチングを繰り返す

  • + は1 つ以上の文字に一致します
  • * * * は 0 個以上の文字と一致します
  • ? 0 文字または 1 文字と一致

応用

電子メールアドレスと一致します。

正規表現

[\w.]+@\w+\.\w+

[\w.] は英数字または に一致します。その後に + を追加すると、複数回一致することを意味します。文字セット [ ] では、. はメタキャラクタではありません。

マッチング結果

[email protected]

  • {n} はn 文字と一致します
  • {m,n} はm~n 文字に一致します
  • {m,} は少なくとも m 文字と一致します

* と + は、可能な限り一致する貪欲なメタ文字です。? を追加すると、*?、+?、{m,n}? などの遅延メタ文字に変換されます。

正規表現

a.+c

マッチング結果

abcabcabc

+ は貪欲であるため、.+ はより多くの可能なコンテンツに一致するため、直前の abc テキストだけを一致させるのではなく、abcabc テキスト全体に一致します。以前との一致は遅延タイプで実現できます。

6. 位置マッチング

単語の境界

\b は単語の境界に一致します。境界は \w と \W の間の位置を指します。\B は単語の境界ではない位置に一致します。

\b は文字ではなく位置のみに一致するため、\babc\b は 3 つの文字に一致します。

文字列境界

^ は文字列全体の先頭に一致し、$ は文字列全体の末尾に一致します。

^ メタ文字は、文字セット内の否定に使用され、文字セット外の一致する文字列の先頭として使用されます。

改行モード (複数行) では、改行は文字列の境界として扱われます。

応用

コード内の // で始まるコメント行と一致します。

正規表現

^\s*\/\/.*$

マッチング結果

  1. public void fun() {
  2.      // 注1
  3.      int a = 1;
  4.      int b = 2;
  5.      // 注2
  6.      int c = a + b;
  7. }

7. 部分式を使用する

( )を使用して部分式を定義します。部分式の内容は独立した要素、つまり文字とみなすことができ、* などのメタ文字が使用されます。

部分式はネストできますが、ネストが深すぎると理解が困難になる可能性があります。

正規表現

(ab){2,}

マッチング結果

アブ

|は or メタ文字で、2 つの部分のいずれかが一致する限り、左側と右側のすべての部分を 2 つの別個の部分として扱います。

正規表現

(19|20)\d{2}

マッチング結果

  1. 1900年
  2. 2010年
  3. 1020

応用

IP アドレスと一致します。

IP アドレスの各部分は 0 ~ 255 の数字であり、正規表現と照合する場合は次の状況が正当です。

  • 1桁
  • 0で始まらない2桁の数字
  • 1から始まる3桁の数字
  • 2 から始まり、2 桁目は 0 ~ 4 の 3 桁の数字です。
  • 25 から始まり、3 桁目は 0 ~ 5 の 3 桁の数字です。

正規表現

((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))

マッチング結果

  1. 192.168.0.1
  2. 00.00.00.00
  3. 555.555.555.555

8. バックトラッキング

後方参照では、\nを使用して部分式を参照します。n は、1 から始まる部分式のシーケンス番号を表します。部分式が一致する内容と一致します。たとえば、部分式が abc に一致する場合、後方参照部分も abc に一致する必要があります。

応用

HTML 内の正当な見出し要素と一致します。

正規表現

\1 は部分式 (h[1-6]) に一致する内容を逆参照します。つまり、部分式に一致する内容と一致する必要があります。

<(h[1-6])>\w*?<\/\1>

マッチング結果

  1. <h1>×</h1>
  2. <h2>×</h2>
  3. <h3>×</h1>

交換

2 つの正規表現が必要です。

応用

電話番号の形式を変更します。

文章

313-555-1234

正規表現を見つける

(\d{3})(-)(\d{3})(-)(\d{4})

正規表現を置き換える

最初の部分式の検索結果に () を追加し、次にスペースを追加し、3 番目と 5 番目の単語式の検索結果の間に - を追加して区切ります。

($1) $3-$5

結果

(313) 555-1234

大文字と小文字の変換

メタキャラクター 説明する
\l 次の文字を小文字に変換する
\u 次の文字を大文字に変換する
\L \L と \E の間のすべての文字を小文字に変換します
\U \U と \E の間のすべての文字を大文字に変換します
\E \L または \U を終了します

応用

テキストの 2 番目と 3 番目の文字を大文字に変換します。

文章

あいうえお

見上げる

(\w)(\w{2})(\w)

交換

$1\U$2\E$3

結果

あいうえお

9、前後を検索

前後の検索では、一致するコンテンツの先頭と末尾で一致するコンテンツを指定しますが、先頭と末尾で一致するコンテンツは含まれません。

前方参照は、末尾一致の内容を指定する?=によって定義され、この一致の内容は ?= の後に定義されます。いわゆる前方検索とは、一致するコンテンツを指定し、このコンテンツを末尾として一致させる必要があるコンテンツを検索することです。後方一致は ?<= で定義されます (注: JavaScript は後方一致をサポートしておらず、Java による後方一致のサポートは完全ではありません)。

応用

電子メール アドレスの @ 文字より前の部分を探します。

正規表現

\w+(?=@)

結果

abc @qq.com

前方検索と後方検索および否定の場合は、= を ! に置き換えるだけです。たとえば、(?=) を (?!) に置き換えます。否定演算により、先頭と末尾が要件を満たしていないものを一致させることができます。

10. 埋め込まれた条件

後方参照条件

条件は、特定の部分式が一致するかどうかであり、一致する場合は、条件式の背後にある内容と一致し続ける必要があります。

正規表現

部分式 (\() は左括弧に一致し、その後に ? が続きます。これは 0 または 1 に一致することを意味します。 ?(1) は条件であり、部分式 1 が一致する場合、条件は true であり、実行する必要があります) 一致、つまり右括弧に一致します。

(\()?abc(?(1)\))

結果

  1. (ABC)
  2. ABC
  3. (ABC

前後の検索条件

条件は定義の先頭と末尾が一致するかどうかで、一致する場合は引き続きマッチングを実行します。先頭と末尾は一致するコンテンツに含まれないことに注意してください。

正規表現

?(?=-) は前方検索条件であり、- が \d{5} に一致する前方検索の最後である場合にのみ、-\d{4} に一致します。

\d{5}(?(?=-)-\d{4})

結果

  1. 11111
  2. 22222-
  3. 33333-4444

参考文献

  • BenForta. 正規表現は知っておく必要があります [M]. People's Posts and Telecommunications Press、2007。

おすすめ

転載: blog.csdn.net/yang134679/article/details/131777577