正規表現 (例あり) - 1

「それでは、正規表現について説明します。このトピックは複雑であると同時に単純でもあります。正規表現を完全に理解するには、分厚い本を 2 ~ 3 冊読む必要があるかもしれませんが、その使用方法は私が教えることができます」たった今。"

「経験豊富なプログラマーはよく冗談を言いますが、問題があり、それを正規表現で解決しようと考えている場合、問題が 2 つあることになります。」

"ふーむ。"

「あまり怖がらせなければよかったのですが、友人。いいえ?」

「わかりました。それでは、新しいトピックは正規表現です。」

「正規表現を単純化しすぎると、正規表現は文字列のパターンになります。」

「文字列が指定されたパターンに一致するかどうかを確認できます。また、区切り文字やパターンを使用して文字列を複数の部分に分割することもできます。」

「でも、簡単なことから始めましょう。パターンとは何ですか?

「SQL では (Java ではありませんが)、文字列が特定のパターンに一致するかどうかを確認できます。次のようになります。」

name like 'Alex%'

ここで、name はパターンをチェックするコマンドのような変数で、「Alex%」がパターンです。

この場合、% は任意の文字列または部分文字列を意味します。

パターン パターンに一致する文字列
「アレックス%」 アレックス
アレックスアンドラ
アレックスアンダー
アレックスアンドラ
…。
'%バツ%' ×
×イム
エール×アンドレ
'%a' オルグ
ヘレン
イラ
_

SQL では、他に 1 文字だけを指定する必要がある場合は、アンダースコア文字「_」を使用します。

パターン パターンに一致する文字列
「アレックス%_」 アレックス
アレックスアンドラ
アレックスアンダー
アレックスアンドラ
…。
'_バツ' アクス
Bx
Cx
「___」 ああ
ああ
ああああ

"それは理にかなっている。"

「それでは、正規表現に移りましょう。」

「通常、正規表現には文字数だけでなく、その「内容」にも制限が含まれます。「マスクは通常、2 つの (場合によってはそれ以上の) 部分で構成されます。最初の部分は文字の「設定」を記述し、2 番目の部分は文字数を記述します。 。」

コンテンツの例をいくつか示します。」

パターン 説明
任意の 1 文字 1
\d 任意の数字 7
\D 数字以外の任意の C
\s スペース、改行、またはタブ文字 「」
\S スペース、タブ、改行を除くすべて f
[az] a から z までの任意の文字 z
[0-9] 0 ~ 9 の任意の数字。 8
\w 任意の単語文字 c
\W 単語以外の文字 _

「すぐには思い出せませんが、それほど難しいことではないようです。」

「素晴らしいですね。マスク内の文字数の例は次のとおりです。 」

パターン 説明
あ? 文字「A」が 1 回出現するか、まったく出現しない
B+ 文字「B」が 1 回以上出現する BBBB
C* 文字「C」が 0 回以上出現する CCC
D{n} 文字「D」が n 回出現します パターン D{4} は DDDD に一致します
E{n,} 文字「E」が n 回以上出現する パターン E{2,} は EEEEEEE に一致します
F{n,m} 文字「F」が n 回から m 回出現します パターン E{2,4} は EEEE に一致します

「それはすべてとても簡単なことのように思えます。」

「すべてをすぐに理解していますね。それでは、全体がどのように見えるかを見てみましょう:」

パターン 説明
[広告]? 「a」と「d」の間の文字が 1 回出現するか、まったく出現しません あいうえお
[bd,z]+ 文字「b」、「c」、「d」、または「z」が 1 回以上出現する b、bcdcdbdbdbdbzzzzbbzbzb、zbz
[1,7-9]* 数字 1、7、8、または 9 が 0 回以上出現する 1、7、9、9777、111199
1{5} 数字の 1 が 5 回出現します 11111
[1,2,a,b]{2} 記号 1、2、'a'、または 'b' が 2 回出現します 11、12、1a、ab、2b、bb、22
[a,0]{2,3} 記号「a」または 0 が 2 回または 3 回出現します aa、a0,00,0a、aaa,000、a00,0a0、a0a

「まだすべてクリアです。」

「本当ですか? うーん。私がすべてをうまく説明したか、それともあなたが理解するのが早すぎるかのどちらかです。まあ、どちらにしても、それは私たちにとって良いことです。」

「新しい洞察をいくつかご紹介します。」

「正規表現は部分文字列の検索によく使用されるため、パターンにさらに 2 つの文字 (^ と $) を追加できます。」

「^ は、部分文字列に文字列の先頭が含まれている必要があることを意味します。」

「$ は、部分文字列に文字列の終わりが含まれている必要があることを意味します。」

"ここではいくつかの例を示します:"

パターン パターンに一致する文字列と部分文字列
{3} ああ ああ  ああああ _ _
{3}$ ああああ ああああ
^a{3} ああ ああああああ
^a{3}$ ああああああああ

「そして、もう一つ重要な点があります。」

「正規表現では、次の文字には特別な意味があります: [ ] \ / ^ $ . | ? * + ( ) { }。これらは制御文字と呼ばれます。したがって、単純に文字列で使用することはできません。」

「Java コードと同様に、エスケープする必要があります。また、Java コードと同様に、これには '\' 文字が使用されます。」

「3つの「?」からなる文字列を記述したい場合 「?」文字があるため、「?{3}」を書くことはできません。は制御文字です。\?{3} のように行う必要があります。'\' 文字を使用したい場合は、'\\' と書く必要があります。

"はい、わかった。"

「そして、ここでもう 1 つの興味深い情報を紹介します。Java コードを含むファイルでは、'\' 文字も制御文字であるため、文字列内でエスケープする必要があります。」

"もちろん。"

「したがって、文字列内で Java 正規表現を定義しようとしている場合は、'\' 文字を 2 回エスケープする必要があります。」

「ここに例があります:」

「c:\anything」に一致するマスクが必要です
理論的には、正規表現は次のようになります:
1 つの「c」文字、
コロン、
バックスラッシュ、
ピリオド、およびアスタリスク (任意の数の文字を表す)。読みやすくするためにスペースを追加しました:
c : \ .*
ただし、文字「\」と「.」は使用できません。エスケープする必要があるため、正規表現は
c :   \\ \ のようになります。*
または、スペースなしで
c: \\ \。*
「正規表現には 3 つのバックスラッシュが必要です。
つまり、Java ファイルでは正規表現は次のようになります。」
String regexp = "c: \\\\ \\. *";

「うわー、おっと。今わかった。」

「そして、これをさらに深く掘り下げることにした場合は、ここにいくつかの良いリンクがあります。」

ウィキペディアの教訓