正規表現の構文を学ぶための記事

以下をクリックしてフォローし、右上隅の「スターに設定」をクリックして、できるだけ早く更新情報を受け取ります~~~

正規表現 (正規表現) は、コード内では正規表現と略されることがよくあります。正規表現は通常、特定のルールに準拠するテキストを取得および置換するために使用され、強力で柔軟なテキスト処理ツールです。規則性は、文字列のタイプを一致させるための規則を記述します。

理解を容易にするために、すべての例の正規表現は"regex= Regular"で表されます。 "=記号の後に正規表現が続きます。 一致した文字には色が付けられます。 連続して一致した文字には 1 のマークが付けられます。暗くて明るい、色の区別。

例: regex=\d+。\d+ は、次のように 1 より大きい任意の数値に一致する通常のルールです。

fdc5140d45f53e40777025d4a79ede9c.png

正規表現構文の学習は主に、正規表現のコンテキストにおけるメタキャラクターとその動作を学習することです。メタ文字には、通常の文字、標準文字、特殊文字、修飾文字 (量指定子)、および位置決め文字 (境界文字) が含まれます。

1.普通のキャラクター

文字[a-zA-Z]、数字[0-9]、下線[-]、漢字、句読点

文字 a と一致するのは regex=a です。

文字 b と一致するのは regex=b です。

文字 a または b と一致する場合は、 regex=a|b となります。この正規表現では特殊文字 "|" が導入されており、その正式名称は "or" です。これを "縦棒" と呼ぶこともできます。つまり、これは "または" を意味します。 。

文字 a、b、または c と一致する場合は、regex=a|b|c になります。

文字 a または b または c または d と一致する場合は、regex=a|b|c|d になります。

もちろん、このように書くのは少しばかげていると思いますが、26 文字すべてに一致する場合、この書き方はあまりにもわかりにくくなります。

ここでは、角括弧「[ ]」とアンダースコア「-」の 2 つの特殊文字が導入されています。

「[ ]」、正式名称は「文字セット」、「角括弧」とも言えます。

「-」は「範囲」を意味し、「to」と呼ぶこともできます。regex=[az] は、a から z までの 26 文字のいずれかと一致します。

次に、文字 a または b または c または d を照合するには、regex=[abcd] とします。

1 ~ 8 の任意の数値と一致させるには、次のように regex=[1-8] と指定して、2 つの数値 0 と 9 が一致しないようにすることができます。

7799deb8b31ca5ac022b95e7bed0f9fd.png

2. 標準文字セット

標準文字セットは、\d、\w、\s などの「多くの一般的な文字」に一致する単純な式です。

0 ~ 9 の任意の数値と一致する場合は、regex=[0-9] または regex= \dになります。

標準の文字セットでは大文字と小文字が区別される必要があり、大文字は逆の意味を持ちます。

regex= \D の場合、次のように数字以外の文字と一致します。つまり、0 ~ 9 の数字とは一致しません。

581ac5f50cb877d6eefbf8824e4719b7.png

以下は、一般的に使用される標準的な文字の説明です。

標準文字 意味
\d 0 ~ 9 の任意の数値と一致します ([0 ~ 9] と同等)
\D [^0-9] と同等の数字以外の文字と一致します。
\w [^A-Za-z0-9_] に相当する任意の文字、数字、またはアンダースコアと一致します。
\W [^A-Za-z0-9_] に相当する、英数字、数字、またはアンダースコア以外の文字と一致します。
\s [\f\n\r\t\v] に相当する、スペース、タブ、フォーム フィードを含む任意の空白文字と一致します。
\S [^\f\n\r\t\v] に相当する、空白以外の任意の文字と一致します。
\n 改行文字と一致する
\r キャリッジリターンと一致します
\t タブ文字と一致する
\v 垂直タブと一致する
\f フォームフィードの一致

3. 特殊文字

これらの文字は、 *、+、?などの正規表現で特別な意味を持ちます。、\など。

「\」は特殊文字と一致するために使用されるエスケープ文字です。

バックスラッシュ「\」と一致させるには、regex=[\\] を使用できます。「\」は特殊文字であるため、その前に別の「\」を追加してエスケープする必要があります。

アスタリスク「*」と一致させるには、regex=\* を使用できます。「*」は特殊文字であるため、その前に別の「*」を追加してエスケープする必要があります。

以下に一般的に使用される特殊文字の説明をいくつか示しますが、これについては後で説明します。

特殊文字 意味
\ 次の文字を特殊文字としてマークするためのエスケープ文字
^ 文字列の先頭と一致する
$ 文字列の末尾の位置と一致します
* 直前の文字または部分式と 0 回以上一致します
+ 先行する文字または部分式と 1 回以上一致します
? 直前の文字または部分式と 0 回または 1 回一致します。
「ドット」は、「\r\n」を除く任意の 1 文字と一致します。
| または
[ ] キャラクターセット
( ) グループ化、括弧文字と一致するには、「\(」または「\)」を使用します。

4.修飾文字 (数量詞)

修飾子文字は数量子とも呼ばれ、一致する文字の数を示すために使用されます。

regex=\d を使用して任意の 1 桁の数字と一致します

regex=\d\d を使用して任意の 2 桁の数字と一致します

regex=\d\d\d を使用して任意の 3 桁の数字と一致します

任意の 16 桁の数字と一致します。このように書くのは少しばかげています。

ここでは数量制限を表す文字「{n}」を導入します。

" {n} "、n は負でない整数で、n 回一致します

注: regex=\d\d{3} は、6 ではなく、任意の 4 つの数値に一致します。量指定子は、その前の文字のみを処理します。regex =\d\d{3} の一致する内容は次のとおりです。

6a2588f3448e1d407ffaabb57853dbb4.png

regex=\d{16} を使用して任意の 16 桁の数字と一致します。

16 桁を超える数値と一致するには、regex=\d{16,} を使用できます。

1 ~ 16 桁以上の任意の数値と一致するには、regex=\d{1,16} を使用できます。

d20fb2a562f0438f99ccd2e21d00a4e6.png

上の図から、regex=\d{1,16} は 1 ~ 16 の任意の数値に一致することがわかります。

以下に、一致数における貪欲モードと非貪欲モードを紹介します。

通常のマッチングのデフォルトは貪欲モードです。つまり、一致する文字数が多いほど優れていますが、貪欲モードでは、一致する文字数が少ないほど優れています。文字数の修飾子を変更した後に、疑問符"?"を追加するだけです。一致する単語。

では、上記と同じ文字列 regex=\d{1,16} は何と一致するのでしょうか?

80fbcba9eff32b0acab05b2851a57536.png

量指定子 {1,16} の後に疑問符「?」が追加され、非貪欲モードを示すため、一致できる数値は 1 つだけです。つまり、一致する文字が少ないほど良いことになります。

以下は、一般的に使用される修飾文字の説明です。

対象となるキャラクター 意味
* 直前の文字または部分式と 0 回以上一致します
+ 先行する文字または部分式と 1 回以上一致します
? 直前の文字または部分式と 0 回または 1 回一致します。
{n} n は、特定の回数 n 回一致する非負の整数です。
{n,} n は負でない整数で、少なくとも n 回一致します。
{n,m} n と m は負ではない整数で、n<=m の場合、少なくとも n 回、最大で m 回一致します。

0 個以上の文字と一致する A は、regex=A* または regex=A{0,} になります。

少なくとも 1 つの文字 A と一致する場合は、regex=A+ または regex=A{1,} になります。

0 または 1 つの文字 A と一致するには、regex=A? または regex=A{0,1} を使用できます。

少なくとも 1 つの LOVE と一致する場合は、正規表現=(LOVE)+ となります。

マッチング効果は以下の通りです。

4f381be57237d1a75b37fcab6de7ee94.png

5. 文字の配置(文字境界)

位置決め文字は文字境界とも呼ばれます。マーカーは文字ではなく特定の条件を満たす位置に一致するため、位置決め文字は「ゼロ幅」になります。

以下は、一般的に使用される位置決め文字の説明です。

アンカーキャラクター 意味
^ 文字列の開始位置と一致し、先頭を示します。
$ 文字列の末尾の位置と一致し、終わりを示します
\b 単語の境界に一致する

Hello で始まる文字列の一致には、regex=^Hello を使用できます。

77caf652a2f62885477fd143add63bcc.png

Hello で終わる文字列と一致させるには、次のように regex=Hello$ を使用できます。

de44c42d52e01204dc997ded82dd8122.png

H で始まり o で終わる任意の長さの文字列と一致させるには、次のようにregex= ^H.*o$を使用できます。

549b336bd0964cf5bba6e8ca2a239f28.png

\b」は、前の文字と次の文字がすべて \w ではない位置に一致します。

regex=hello\b が文字列「hello,hello1 hello hello1 bhello」で一致した場合、

マッチング結果は以下の通りです。

864c440bb24e36e09bb7822b4ad73be9.png

次の質問を分析してください。なぜhello1 は通常のパターン「hello\b」と一致しないのでしょうか?

首先\b是一个定位字符,它是零宽的,标识一个位置,这个位置的前面和这个位置的后面不能全是\w,即不能全是字母数字和下划线[A-Za-z0-9_],而hello1的o与1之间的位置前面是o后面是1,前后全是\w,不符合\b匹配的含义,因此hello1不能匹配正则表达式“hello\b”

但是bhello可以匹配“hello\b”这个正则,因为hello的结尾的位置,前面是o,后面是空白,所以符合\b匹配的含义,因此bhello可以匹配“hello\b”这个正则。

6、自定义字符集合

方括号[ ]表示字符集合,即[ ]表示自定义集合,用[ ]可以匹配方括号里的任意一个字符。

regex=[aeiou]匹配“a”,“e”,“i”,“o”,“u”任意一个字符,也就是可以匹配集合[aeiou]的任意一个字符。

需要注意,特殊字符(除了小尖角“^和中划线“-)被包含到方括号中,就会失去特殊意义,只代表其字符本身。

regex=[abc+*?]匹配“a”,“b”,“c”任意一个字符或者“+”,“*”,“?”,即包含在自定义集合中的特殊字符“+”,“*”,“?”失去了特殊含义,只表示其字符本身的意思。

特殊字符小尖角“^,原本含义是匹配字符串的开始位置,如果包含在自定义集合[ ]中,则表示取反的意思。

比如:regex=[^aeiou]匹配“a”,“e”,“i”,“o”,“u”之外的任意一个字符。

中划线“-,在自定义集合[ ]中,表示“范围”,而不是字符“-本身,regex=[a-z],匹配从a到z中26个字母的任意一个。

除小数点“.”外,标准字符集合包含在方括号中,仍然表示集合范围。

regex=[\d.+]匹配0-9的任意一个数字或者小数点“.”或者加号“+”

也就是说\d在自定义集合中仍然表示数字,但是小数点在字符集合中只表示小数点本身,而不是除“\r\n”之外的任何单个字符。

7、选择符和分组

表达式 作用
pattern1|pattern2 或的关系,匹配左边的pattern1或右边的pattern2
(pattern) 匹配pattern并获取这一匹配,并存储
(?:pattern) 匹配pattern但不获取匹配结果,也就是不进行存储


regex=x|y,匹配字符x或y。

( )表示捕获组,( )的作用如下:

1、括号中的表达式可以作为整体被修饰,用来表示匹配括号中表达式的次数

regex=(abc){2,3},可以匹配连续的2个或3个abc,如下:

b578f5e15c2d16e3a3679dfffc7bd5df.png

2、括号中的表达式匹配到的内容会存储起来,并可以获取到括号中表达式匹配到的内容

3、每一对括号会分配一个编号,使用( )的捕获根据左括号的顺序从1开始自动编号,编号为0的捕获是整个正则表达式匹配到的文本。

捕获组( )可以把匹配的内容存储起来,那么如何获取( )捕获到的内容呢,下面介绍反向引用。

8、反向引用“\number”

每一对括号会分配一个编号,使用( )的捕获根据左括号的顺序从1开始自动编号。通过反向引用,可以对分组已捕获的字符串进行引用。

“\number”中的number就是组号。

regex=(abc)d\1可以匹配字符串abcdabc,即\1表示把获取到的第一组再匹配一次,如下:

104385cd880e6828117760515e11dd9a.png

(?:pattern)表示非捕获组,匹配括号中表达式匹配到的内容,但是不进行存储匹配到的内容。这在使用 "或" 字符 (|) 来组合一个正则的各个部分是很有用的。

例如:匹配字符“story”或者“stories”,regex=stor(?:y|ies)就是一个比 regex=story|stories更简略的表达式。

9、预搜索(零宽断言)

预搜索,又叫零宽断言,又叫环视,它是对位置的匹配,与定位字符(边界字符)类似。

表达式 作用
(?=pattern) 断言此位置的后面能匹配表达式pattern
(?<=pattern) 断言此位置的前面能匹配表达式pattern
(?!pattern) 断言此位置的后面不能匹配表达式pattern
(?<!pattern) 断言此位置的前面不能匹配表达式pattern

regex=love (?=story)匹配的结果如下(匹配“love ”后面是story):

a2749aefbb31f7495d612f5557d27dc8.png

regex=love (?!story)匹配的结果如下(匹配“love ”后面不能是story):

301d776e15f4b28a65749b51fc5fe634.png

10、运算符的优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

次の表は、優先度の高いものから低いものの順に並べられています。

オペレーター 説明する
\ エスケープ文字
()、(?:)、(?=)、[] 括弧と角括弧、グループ化とカスタム コレクション
*、+、?、{n}、{n,}、{n,m} 修飾文字 (数量詞)
^、$、標準文字、文字 アンカー文字(境界文字)と文字
| または

注:「|」または演算の優先順位は最も低く、通常の文字の優先順位よりも低くなります。

したがって、regex=r|loom は、次のように「r」または「loom」と一致します。

e648543036dfe1acafd1e3e593461941.png

「room」または「loom」と一致させたい場合は、次のように括弧を使用して部分式 regex=(r|l)oom を作成します。

9aa050a254efc2efa60f0046f664c3e4.png

最後に、開発で正規表現を使用するプロセスを紹介します。

1. 照合するデータの特性を分析し、さまざまなテスト データをシミュレートします。

2. 正規ツールを使用して正規表現を作成し、テスト データと照合して、作成した正規表現を検証します。

3. 正規ツールで検証した正規表現をプログラム内で呼び出します。

ここで皆様にお勧めする正規ツール「RegexBuddy」は、インターネットからダウンロードするか、バックグラウンドでキーワード「正規表現」を返信することで入手できます。

ここまでで正規表現の構文を紹介しましたが、もうマスターできましたか?ぜひ体験してみてください。

おすすめ

転載: blog.csdn.net/z123456789XDW/article/details/132959873