以下をクリックしてフォローし、右上隅の「スターに設定」をクリックして、できるだけ早く更新情報を受け取ります~~~
正規表現 (正規表現) は、コード内では正規表現と略されることがよくあります。正規表現は通常、特定のルールに準拠するテキストを取得および置換するために使用され、強力で柔軟なテキスト処理ツールです。規則性は、文字列のタイプを一致させるための規則を記述します。
理解を容易にするために、すべての例の正規表現は"regex= Regular"で表されます。 "=記号の後に正規表現が続きます。 一致した文字には色が付けられます。 連続して一致した文字には 1 のマークが付けられます。暗くて明るい、色の区別。
例: regex=\d+。\d+ は、次のように 1 より大きい任意の数値に一致する通常のルールです。
正規表現構文の学習は主に、正規表現のコンテキストにおけるメタキャラクターとその動作を学習することです。メタ文字には、通常の文字、標準文字、特殊文字、修飾文字 (量指定子)、および位置決め文字 (境界文字) が含まれます。
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 が一致しないようにすることができます。
2. 標準文字セット
標準文字セットは、\d、\w、\s などの「多くの一般的な文字」に一致する単純な式です。
0 ~ 9 の任意の数値と一致する場合は、regex=[0-9] または regex= \dになります。
標準の文字セットでは大文字と小文字が区別される必要があり、大文字は逆の意味を持ちます。
regex= \D の場合、次のように数字以外の文字と一致します。つまり、0 ~ 9 の数字とは一致しません。
以下は、一般的に使用される標準的な文字の説明です。
標準文字 | 意味 |
\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} の一致する内容は次のとおりです。
regex=\d{16} を使用して任意の 16 桁の数字と一致します。
16 桁を超える数値と一致するには、regex=\d{16,} を使用できます。
1 ~ 16 桁以上の任意の数値と一致するには、regex=\d{1,16} を使用できます。
上の図から、regex=\d{1,16} は 1 ~ 16 の任意の数値に一致することがわかります。
以下に、一致数における貪欲モードと非貪欲モードを紹介します。
通常のマッチングのデフォルトは貪欲モードです。つまり、一致する文字数が多いほど優れていますが、非貪欲モードでは、一致する文字数が少ないほど優れています。文字数の修飾子を変更した後に、疑問符"?"を追加するだけです。一致する単語。
では、上記と同じ文字列 regex=\d{1,16} は何と一致するのでしょうか?
量指定子 {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)+ となります。
マッチング効果は以下の通りです。
5. 文字の配置(文字境界)
位置決め文字は文字境界とも呼ばれます。マーカーは文字ではなく特定の条件を満たす位置に一致するため、位置決め文字は「ゼロ幅」になります。
以下は、一般的に使用される位置決め文字の説明です。
アンカーキャラクター | 意味 |
^ | 文字列の開始位置と一致し、先頭を示します。 |
$ | 文字列の末尾の位置と一致し、終わりを示します |
\b | 単語の境界に一致する |
Hello で始まる文字列の一致には、regex=^Hello を使用できます。
Hello で終わる文字列と一致させるには、次のように regex=Hello$ を使用できます。
H で始まり o で終わる任意の長さの文字列と一致させるには、次のようにregex= ^H.*o$を使用できます。
「\b」は、前の文字と次の文字がすべて \w ではない位置に一致します。
regex=hello\b が文字列「hello,hello1 hello hello1 bhello」で一致した場合、
マッチング結果は以下の通りです。
次の質問を分析してください。なぜ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,如下:
2、括号中的表达式匹配到的内容会存储起来,并可以获取到括号中表达式匹配到的内容
3、每一对括号会分配一个编号,使用( )的捕获根据左括号的顺序从1开始自动编号,编号为0的捕获是整个正则表达式匹配到的文本。
捕获组( )可以把匹配的内容存储起来,那么如何获取( )捕获到的内容呢,下面介绍反向引用。
8、反向引用“\number”
每一对括号会分配一个编号,使用( )的捕获根据左括号的顺序从1开始自动编号。通过反向引用,可以对分组已捕获的字符串进行引用。
“\number”中的number就是组号。
regex=(abc)d\1可以匹配字符串abcdabc,即\1表示把获取到的第一组再匹配一次,如下:
(?:pattern)表示非捕获组,匹配括号中表达式匹配到的内容,但是不进行存储匹配到的内容。这在使用 "或" 字符 (|) 来组合一个正则的各个部分是很有用的。
例如:匹配字符“story”或者“stories”,regex=stor(?:y|ies)就是一个比 regex=story|stories更简略的表达式。
9、预搜索(零宽断言)
预搜索,又叫零宽断言,又叫环视,它是对位置的匹配,与定位字符(边界字符)类似。
表达式 | 作用 |
(?=pattern) | 断言此位置的后面能匹配表达式pattern |
(?<=pattern) | 断言此位置的前面能匹配表达式pattern |
(?!pattern) | 断言此位置的后面不能匹配表达式pattern |
(?<!pattern) | 断言此位置的前面不能匹配表达式pattern |
regex=love (?=story)匹配的结果如下(匹配“love ”后面是story):
regex=love (?!story)匹配的结果如下(匹配“love ”后面不能是story):
10、运算符的优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
次の表は、優先度の高いものから低いものの順に並べられています。
オペレーター | 説明する |
\ | エスケープ文字 |
()、(?:)、(?=)、[] | 括弧と角括弧、グループ化とカスタム コレクション |
*、+、?、{n}、{n,}、{n,m} | 修飾文字 (数量詞) |
^、$、標準文字、文字 | アンカー文字(境界文字)と文字 |
| | または |
注:「|」または演算の優先順位は最も低く、通常の文字の優先順位よりも低くなります。
したがって、regex=r|loom は、次のように「r」または「loom」と一致します。
「room」または「loom」と一致させたい場合は、次のように括弧を使用して部分式 regex=(r|l)oom を作成します。
最後に、開発で正規表現を使用するプロセスを紹介します。
1. 照合するデータの特性を分析し、さまざまなテスト データをシミュレートします。
2. 正規ツールを使用して正規表現を作成し、テスト データと照合して、作成した正規表現を検証します。
3. 正規ツールで検証した正規表現をプログラム内で呼び出します。
ここで皆様にお勧めする正規ツール「RegexBuddy」は、インターネットからダウンロードするか、バックグラウンドでキーワード「正規表現」を返信することで入手できます。
ここまでで正規表現の構文を紹介しましたが、もうマスターできましたか?ぜひ体験してみてください。