1.概要
正規表現(正規表現、正規表現)パターンマッチで、機能のシリーズは、本文中に記載されています。
自然言語として背の高い、頑丈な正規表現は、文字列の特性を記述するために使用される抽象度の高い文字、であるようなものを記述すると、他の言葉は、機能を抽象化。
正規表現は、通常は独立して存在していない、プログラミング言語やツールのさまざまなホスト言語としての正規のサポートを提供し、独自の言語、特定のカットまたは拡張の特性に応じました。
定期的なエントリは簡単ですが、限られた文法規則を把握するのは簡単ですが、現在普及率は高くないが、主な理由は、通常の学校の数が多い、文書の様々なホスト言語は、その詳細の一部にすぎ注意しており、これらの詳細は、初心者が注意を必要としない通常です。
あなたが正規表現の深い理解をしたいが、これらの詳細は懸念される場合はもちろん、これは正規表現の世界に入るために何か、定期的の始まりとLETの開始、です。
2.正規表現の基礎
2.1基本概念
2.1.1文字列
文字列の場合a5
、2つの文字で構成されa
、5
同様に3箇所の構図、それは理解の正規表現マッチング原則のために重要です。
2.1.2所持およびゼロ幅の文字
正規表現マッチング処理、文字ではなく、位置の内容に合わせて部分式であれば、最終的な試合結果に保存し、その後、このサブ表現は、文字の所持で検討;部分式マッチングなら唯一の場所、又はコンテンツが一致は部分式ゼロ幅を考慮し、次に、マッチの最終結果に保存されていません。
所持またはゼロ幅文字は、マッチングの面で最終結果を保存するかどうかの内容と照合されます。
所持文字は相互に排他的で、ゼロ幅非相互に排他的です。それは、同時に唯一のサブ式で一致させることができる文字、および位置が、同時に複数のゼロ幅のサブ式で一致させることができます。
2.1.3正規表現を構成します
正規表現は、2つの文字で構成されています。一つは、正規表現の中で、特定の特別な意味でメタキャラクタ、他のプレーンであるテキスト文字。
メタ文字は、文字のようなことがあり^
、文字のシーケンスは、このようなことが可能\w
。
2.2元の文字(メタ文字)
2.2.1文字セット(文字クラス)
文字セットが一致して[ ]
含まれる任意の文字を。いずれか1つだけですが、。
文字セットはハイフンでサポートされている-
範囲を示すために。とき-
の時間範囲を設定する前と後、次の文字の符号ビットの前の文字コードビット未満を必要とします。
[^…]
否定文字セット。リストされていない任意の文字を表すために否定文字セットは、同じ缶が一つだけあること。否定文字セットもハイフンでサポートされている-
範囲を示すために。
表現 | 説明 |
---|---|
[abc] |
表現a またはb またはc |
[0-9] |
それは表し0~9 数と同等のいずれかを[0123456789] |
[\u4e00-\u9fa5] |
漢字は、いずれかを表します |
[^a1<] |
間を表しa 、1 、< Aのうち他の文字 |
[^a-z] |
これは、小文字以外の任意の文字を表し、 |
例:
[0-9][0-9]
試合ではWindows 2003
、試合が成功し、試合の結果です20
。
[^inW]
試合ではWindows 2003
、試合が成功し、試合の結果ですd
。
文字の2.2.2一般的な略語の範囲
非常に人気によるものなど数字、などいくつかの一般的に使用される文字の範囲、については、さえして[0-9]
文字のようなセットはまだ面倒に見えるので、文字の共通範囲を表すために、いくつかのメタ文字を定義します。
表現 | 説明 |
---|---|
\d |
番号のいずれかが対応すること[0-9] 、すなわち、0~9 のいずれか |
\w |
同等の任意の文字または数字またはアンダースコア、[a-zA-Z0-9_] |
\s |
任意の空白文字の等価[ \r\n\f\t\v] |
\D |
任意の数字以外の文字、\d 否定、同等[^0-9] |
\W |
w と同等の否定、[^a-zA-Z0-9_] |
\S |
任意の非白色文字\s 否定の等価[^ \r\n\f\t\v] |
例:
\w\s\d
試合ではWindows 2003
、試合が成功し、試合の結果ですs 2
。
2.2.3小数点
小数点のほかに一致させることができます\n
以外の任意の文字を。あなたには、一致させたい場合は\n
、一般的な使用を含め、すべての文字を、[\s\S]
またはによって.
追加(?s)
達成するためのマッチングパターンを。
表現 | 説明 |
---|---|
. |
また一致改行\n A以外の任意の文字を |
2.2.4その他のメタキャラクタ
表現 | 説明 |
---|---|
^ |
場所は、文字列の先頭にマッチし、任意の文字に一致しません |
$ |
一致する文字列の位置の終わりには、任意の文字に一致しません |
\b |
単語の境界と一致して、任意の文字に一致しません |
例えば:
^a
試合ではcba
表現が文字の後ろの開始位置を必要としているため、試合は失敗したa
が、cba
明らかに満足していません。
\d$
試合では123
、一致は、一致する結果、成功している3
ような、多数の終わりにない場合、この式は、マッチの末尾の数字を必要とし、123abc
マッチが失敗しました、。
2.2.5エスケープ文字
いくつか目に見えない文字、またはメタ文字を使用すると、文字そのものにマッチさせたいよう、定期的に特別な意味を持っている必要が\
エスケープされます。
表現 | 説明 |
---|---|
\r 、\n |
キャリッジリターンとラインフィード |
\\ |
一致\ 自体を |
\^ 、\$ 、\. |
各試合^ 、$ そして. |
試合自体は次の文字は、通常、エスケープする必要があります。実用的なアプリケーションでは、状況に応じて、あなたは、下記の文字を超える文字をエスケープする必要があります。
.
$
^
{
[
(
|
)
+
?
\
2.2.6数量詞(数量詞)
量词表示一个子表达式可以匹配的次数。量词可以用来修饰一个字符、字符组,或是用()
括起来的子表达式。一些常用的量词被定义成独立的元字符。
表达式 | 说明 | 举例 |
---|---|---|
{m} |
表达式匹配m次 | \d{3} 相当于\d\d\d” (abc){2}相当于 abcabc| | {m,n}| 表达式匹配最少*m*次,最多*n*次 | \d{2,3}可以匹配 12或 321等*2*到*3*位的数字 | | {m,}| 表达式至少匹配*m*次 | [a-z]{8,}表示至少*8*位以上的字母 | | ?| 表达式匹配*0*次或*1*次,相当于 {0,1}| ab?可以匹配 a或 ab| | | 表达式匹配0次或任意多次,相当于 {0,}| <[^>]>中 [^>]表示*0*个或任意多个不是 >的字符 | | +| 表达式匹配*1*次或意多次,至少*1*次,相当于 {1,}| \d\s+\d`表示两个数字中间,至少有一个以上的空白字符 |
注意:在不是动态生成的正则表达式中,不要出现{1}
这样的量词,如\w{1}
在结果上等价于\w
,但是会降低匹配效率和可读性,属于画蛇添足的做法。
2.2.7 分支结构(Alternation)
当一个字符串的某一子串具有多种可能时,采用分支结构来匹配,|
表示多个子表达式之间或的关系,|
是以()
限定范围的,如果在|
的左右两侧没有()
来限定范围,那么它的作用范围即为|
左右两侧整体。
表达式 | 说明 |
---|---|
\| |
多个子表达式之间取或的关系 |
举例:
^aa|b$
在匹配cccb
时,是可以匹配成功的,匹配的结果是b
,因为这个表达式表示匹配^aa
或b$
,而b$
在匹配cccb
时是可以匹配成功的。
^(aa|b)$
在区配cccb
时,是匹配失败的,因为这个表达式表示在开始和结束位置之间只能是aa
或b
,而cccb
显然是不满足的。
3. 正则表达式进阶
3.1 捕获组(Capture Group)
捕获组就是把正则表达式中子表达式匹配的内容,保存到内存中以数字编号或手动命名的组里,以供后面引用。
表达式 | 说明 |
---|---|
(Expression) |
普通捕获组,将子表达式Expression匹配的内容保存到以数字编号的组里 |
(?<name> Expression) |
命名捕获组,将子表达式Expression匹配的内容保存到以name命名的组里 |
普通捕获组(在不产生歧义的情况下,简称捕获组)是以数字进行编号的,编号规则是以(
从左到右出现的顺序,从1
开始进行编号。通常情况下,编号为0
的组表示整个表达式匹配的内容。
命名捕获组可以通过捕获组名,而不是序号对捕获内容进行引用,提供了更便捷的引用方式,不用关注捕获组的序号,也不用担心表达式部分变更会导致引用错误的捕获组。
3.2 非捕获组
一些表达式中,不得不使用( )
,但又不需要保存( )
中子表达式匹配的内容,这时可以用非捕获组来抵消使用( )
带来的副作用。
表达式 | 说明 |
---|---|
(?:Expression) |
进行子表达式Expression的匹配,并将匹配内容保存到最终的整个表达式的区配结果中,但Expression匹配的内容不单独保存到一个组内 |
3.3 反向引用
捕获组匹配的内容,可以在正则表达式的外部程序中进行引用,也可以在表达式中进行引用,表达式中引用的方式就是反向引用。
反向引用通常用来查找重复的子串,或是限定某一子串成对出现。
表达式 | 说明 |
---|---|
\1 ,\2 |
对序号为1和2的捕获组的反向引用 |
\k<name> |
对命名为name的捕获组的反向引用 |
举例:
(a|b)\1
在匹配abaa
时,匹配成功,匹配到的结果是aa
。(a|b)
在尝试匹配时,虽然既可以匹配a
,也可以匹配b
,但是在进行反向引用时,对应()
中匹配的内容已经是固定的了。
3.4 环视(Look Around)
环视只进行子表达式的匹配,匹配内容不计入最终的匹配结果,是零宽度的。
环视按照方向划分有顺序和逆序两种,按照是否匹配有肯定和否定两种,组合起来就有四种环视。环视相当于对所在位置加了一个附加条件。
表达式 | 说明 |
---|---|
(?<=Expression) |
逆序肯定环视,表示所在位置左侧能够匹配Expression |
(?<!Expression) |
逆序否定环视,表示所在位置左侧不能匹配Expression |
(?=Expression) |
確かに見て回る順序は、右の場所を一致させることができ表し、式を |
(?!Expression) |
負のシーケンスを中心に見て、右側がの場所と一致しない式を |
例:
(?<=Windows )\d+
マッチにおいてWindows 2003
、一致が成功し、マッチング結果2003
。私たちは知っている\d+
複数の番号と一致すると、(?<=Windows )
左側には位置がなければなりません表し追加条件に相当しWindows
、それはマッチをカウントされません一致するものを、。また、通常のマッチングOffice 2003
、マッチが失敗し、左の部分文字列ではない数字の任意の文字列のでWindows
。
(?!1)\d+
試合では123
、試合が成功し、試合の結果です23
。\d+
複数の番号と一致しますが、追加の条件を(?!1)
必要と右の場所ではありません1
、場所が正常に一致した2
前方位置を。
怠惰と貪欲3.5
未完......
元ここをクリックし(ラベルを入力した後、右によると、この記事へすばやく移動)