正規表現 (英語:、多くの場合、or と省略されます) は、正規表現、正規表現、正規表現、正規表現、正規表現とも呼ばれ、単純な文字列を使用してテキスト内のすべての単語を記述し、一致させるコンピューター サイエンスの概念です。形式を指定する文字列に一致します。多くのテキスト エディタが正規表現を使用した検索をサポートするようになりました。

正規表現(英語:、多くの場合、 or と省略されます) は、正規表現正規表現、正規表現正規表現正規表現とも呼ばれ、単純な文字列を使用してテキスト内のすべての単語を記述し、一致させるコンピューター サイエンスの概念です。多くのテキスト エディターは正規表現を使用した、指定された形式に一致する文字列の検索と置換をサポートするようになりました。

さまざまな場所で使用される「正規表現」の一般的な別名
中国本土
台湾
香港とマカオ

多くのプログラミング言語は、文字列を操作するための正規表現の使用をサポートしています。たとえば、Perlには強力な正規表現エンジンが組み込まれています。正規表現の概念は、もともとUnixツール ソフトウェア ( sedgrepなど) によって普及しました。

翻訳の問題

文字列のパターン記述する式は、パターン式/ルール式と呼ばれるべきですが、正規表現と呼ばれており、これは不正確です。その結果、現在では、正規表現やルールに翻訳されるように、正規表現が多くの中国語で翻訳されますまたは従来の、式を演算式などに変換します。

歴史

正規表現の原型は、理論計算機科学の自動制御理論や形式言語理論に登場しました。これらの分野では、コンピューティング (自動制御) のモデルと形式言語の記述と分類に関する研究が行われます。

1940年、ウォーレン・マカロックとウォルター・ピッツは、神経系のニューロンを小さくて単純な自動制御細胞として説明しました。

1950 年代、数学者のスティーブン コール クレーンは、このモデルを説明するために「正則集合」と呼ばれる数学的表記法を使用しました。Ken Thompson はこのシンボルをエディタ QED に導入し、続いてUnix上のエディタ、そして最終的にgrepに導入しました。それ以来、正規表現はさまざまなツールやUnix 系システムで広く使用されるようになりました。正規表現の仕様は、基本正規表現 (,) と拡張正規表現 (,) の 2 つの主要な流派に分かれています。互換性のあるシステムでは、 や などのツールが仕様に準拠しており、一部のデータベース システムの正規表現も仕様に準拠しています。、、、およびすべては歴史上最も初期の正規表現である に属しているため、メタキャラクターは特別な意味を持つ前に翻訳する必要があります。、メタキャラクターに属しており、翻訳する必要はありません。

正規表現は、1986 年 1 月 19 日に Henry Spencer がリリースしたものに由来し、Philip Hazel によって開発され、多くの最新ツールで使用される正規表現 (Perl 互換正規表現) ライブラリに進化しました。

プログラミング言語間の正規表現の統合は、現在非常に不十分に開発されています。サブプロジェクトはこれを念頭に置いて設計されました。

この意味での正規表現は、有限状態オートマトンが正確に受け入れることができる言語クラスである正規言語を表現できます。しかし、シンプルさには重要な違いがあります。特定の種類の正規言語は、サイズが指数関数的に増加するオートマトンによってのみ記述できますが、必要な正規表現の長さは直線的にのみ増加します。

正規表現は、チョムスキーのタイプ 3文法のレベルに対応します。しかし、通常、プログラミング言語またはその関連ライブラリ ( PCREなど)に実装された正規表現の表現力は、チョムスキーの階層におけるタイプ 3文法のスーパーセットです。一方、正規表現と非決定的有限状態オートマトン ( ) の間には、このサイズの爆発を引き起こさない単純なマッピングがあり、この目的のために正規表現の代替として使用されることがよくあります。

この形式化には冗長性があり、通常、同じ言語を表現できるさまざまな正規表現が存在することで明らかです。与えられた 2 つの正規表現に対して、それらが記述する言語が本質的に同等であるかどうかを判断するためのアルゴリズムを作成することは可能です。つまり、各式を最小限の決定論的有限オートマトンに還元し、それらが同型 (同等) であるかどうかを判断することができますこの冗長性はどの程度削減できるでしょうか? まだ完全に表現力がある正規表現の興味深いサブセットを見つけることはできるでしょうか? これは驚くほど難しい質問を引き起こします。Kleene アスタリスクと共用体は明らかに必要ですが、それらの使用を制限できる可能性があります。正規表現は非常に単純であるため、構文的に正規の形式に書き直す方法はありません。過去に公理化が行われていなかったため、アスタリスクの高さの問題が発生しました。正規表現は最近、クリーネ代数を使用して公理化されています。

実際の「正規表現」エンジンの多くは、正規表現では代数的に表現できない機能を実装しています。

基本的な文法

正規表現は通常、パターン() と呼ばれ、特定の構文ルールに準拠する一連の文字列を記述したり、一致させたりするために使用されます。たとえば、Handel、Händel、Haendel という 3 つの弦はすべてH(a|ä|ae)ndelこのパターンで記述できます。ほとんどの正規表現は次の構造になっています。

選ぶ

  • 垂直バーは、|優先度が最も低い選択肢 (つまり、OR セット) を表します。たとえば、gray|grey「または」と一致させることができます。

数量限定

特定の文字の後の数量修飾子は、その前の文字の許容される出現数を制限するために使用されます。最も一般的な数量修飾子には+?と が含まれます*(数量修飾がない場合は、1 回だけ出現することを意味します)。

  • プラス記号は、+前の文字が少なくとも 1 回出現する必要があることを意味します。(1回以上)。たとえば、goo+glegoogle、google、goooogle などに一致します。
  • 疑問符?は、前の文字が最大 1 回出現できることを意味します。(0回または1回)。たとえば、colou?r色を一致させることもできます。
  • アスタリスクは*、前の文字が表示されないか、または 1 回または複数回表示される可能性があることを示します。(0回、1回以上)。たとえば、0*4242、042、0042、00042 などを照合できます。

マッチ

  • 括弧()を使用して演算子の範囲と優先順位を定義できます。たとえば、これは父親と祖父を一致させることgr(a|e)y相当しますgray|grey(grand)?father

上記のコンストラクターは自由に組み合わせることができるため、H(ae?|ä)ndelと はH(a|ae|ä)ndel同じであり、{"Handel"、"Haendel"、"Händel"} を意味します。

正確な構文は、ツールやプログラムによって異なる場合があります。

PCRE 式の完全なセット

正規表現にはさまざまな種類があります。次の表は、PCRE のメタキャラクタと正規表現のコンテキストでのメタキャラクタの動作の完全なリストであり、どちらのプログラミング言語 (正規表現文法のサブセット) にも適用できます。

キャラクター 説明する
\ 次の文字を特殊文字 (リストについてはこの表を参照)、リテラル文字 (^$()*+?.[\{| 合計 12 個あります)、または後方参照 ()、または8 進エスケープ文字。たとえば、「n」は文字「n」と一致します。\n」は改行文字と一致します。シーケンス " \\" は " " と一致し\、" \(" は " (" と一致します。
^ 入力文字列の先頭と一致します。オブジェクトのプロパティが設定されている場合、 ^ は" \n" または " "\rの後の位置にも一致します。
$ 入力文字列の末尾と一致します。オブジェクトのプロパティが設定されている場合、$ は" \n" または " "\rの前の位置にも一致します。
* 直前の部分式と 0 回以上一致します。たとえば、zo* は " z"、" zo"、および " zoo" に一致します。*{0,} に相当します。
+ 直前の部分式と 1 回以上一致します。たとえば、「 」は「 」と「 」zo+に一致しますが、「」には一致しません。+ は {1,} と同等です。zozooz
? 直前の部分式と 0 回または 1 回一致します。たとえば、「do(es)?」は「 」の「 」および「 」doesと一致します? {0,1} に相当します。dodoes
{n} n は非負の整数です。一致が n 回決定されました。たとえば、「o{2}」はBob「 」の「 」と一致することはできませんが、 「 」の 2 つの o はo一致します。food
{n,} n は非負の整数です。少なくとも n 回一致します。たとえば、「 」は「 」の「 」o{2,}とは一致しませんが、 「 」内のすべての「o」には一致します。」は「 」と同等です」は「 」と同等ですBobofooooodo{1,}o+o{0,}o*
{n,m} m と n は両方とも非負の整数であり、n<=m です。少なくとも n 回、最大で m 回一致します。たとえば、「 」は「 」の最初の 3 つの o とo{1,3}一致します。foooooodo{0,1}」は「 」と同等ですo?カンマと 2 つの数字の間にスペースを入れることはできないことに注意してください。
? 非貪欲量子化 (): 文字が他の繰り返し修飾子 (*、+、?、{n}、{n,}、{n,m}) のいずれかの直後にある場合、非貪欲モードは検索文字列の可能な限り少ない部分と一致しますが、デフォルトの貪欲モードは検索文字列の可能な限り多くの部分と一致します。たとえば、文字列 " oooo" の場合、" o+?" は単一の " o" に一致しますが、" o+" はすべての " " に一致しますo
. \r「 " " "\nを除く任意の 1 文字と一致します。\r「 " " "を含む任意の文字と一致するには\n(.|\r|\n)" " のようなパターンを使用します。
(pattern) 一致し、この一致の部分文字列を取得します。この部分文字列は後方参照に使用されます。取得された一致は、 のセットと の 0…0…9 属性を使用して、生成されたセットから取得できます。括弧文字と一致させるには、「\(」または「\)」を使用します。数量の接尾辞を付けることができます。
(?:pattern) 一致しますが、一致する部分文字列 () は取得されません。これは、一致を取得できず、一致する部分文字列は後方参照用に保存されないことを意味します。これは、文字「 」を使用してパターンの一部を結合する場合に(|)便利です。たとえば、「industr(?:y|ies)」はindustry|industries「 」よりも単純な表現です。
(?=pattern) Positive lookahead() は、一致する文字列の先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「 」は「 」の「 」Windows(?=95|98|NT|2000)と一致しますが、「」の「」とは一致しません。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。Windows2000WindowsWindows3.1Windows
(?!pattern) Forward negative lookahead() は、一致しない文字列の先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「 」は「 」の「 」Windows(?!95|98|NT|2000)と一致しますが、「」の「」と一致することはできません。プリフェッチは文字を消費しません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。Windows3.1WindowsWindows2000Windows
(?<=pattern) 逆方向 () ポジティブ事前チェックは順方向ポジティブ事前チェックと似ていますが、方向が逆です。たとえば、「 」は「 」の「 」(?<=95|98|NT|2000)Windowsと一致しますが、「」の「」とは一致しません。2000WindowsWindows3.1WindowsWindows
(?<!pattern) 逆ネガティブルックアップは順ネガティブルックアップと似ていますが、方向が逆です。たとえば、「 」は「 」の「 」(?<!95|98|NT|2000)Windowsと一致しますが、「」の「」と一致することはできません。3.1WindowsWindows2000WindowsWindows
x|y () で囲まれていない場合、その範囲は正規表現全体です。たとえば、「z|food」は「z」または「food」と一致します。(?:z|f)ood」は「zood」または「food」と一致します。
[xyz] 文字コード()。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。特殊文字のみ バックスラッシュ\ は特別な意味を保持し、文字をエスケープするために使用されます。アスタリスク、プラス記号、さまざまな括弧などの他の特殊文字は、通常の文字として扱われます。キャレット ^ が先頭にある場合は、一連の否定文字を表し、文字列の途中にある場合は、単なる通常の文字です。ハイフン - 文字列の途中にある場合は文字範囲の説明を表し、最初 (または最後) にある場合は単なる通常の文字です。右角括弧はエスケープされるか、最初の文字として表示される必要があります。
[^xyz] 除外された文字セット ()。リストされていない文字と一致します。たとえば、「[^abc]」は「plain」の「plin」と一致します。
[a-z] 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「 」は、「 」から「 」の範囲内の任意の小文字の英字[a-z]と一致します。az
[^a-z] 排他的な文字範囲。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は、 「 a」から「 」zの範囲にない任意の文字に一致します。
[:name:] 名前付き文字クラス () の文字を式に追加します。角括弧式でのみ使用できます
[=elt=] 文字「」に相当する現在の下位のsort()要素を追加します。たとえば、[=a=] は、ä、á、à、ă、ắ、ằ、ẵ、ẳ、â、ấ、ầ、ẫ、ẩ、Ǝ、å、ƻ、ä、Ɵ、ã、ŧ、を増加させる可能性があります。 ơ、ą、ā、ả、Ł、Ń、ạ、ặ、ậ、ḁ、ⱥ、ᶏ、ɐ、ɑ。角括弧式でのみ使用できます。
[.elt.] 增加排序元素()到表达式中。这是因为某些排序元素由多个字符组成。例如,29个字母表的西班牙语, "CH"作为单个字母排在字母C之后,因此会产生如此排序“cinco, credo, chispa”。只能用于方括号表达式。
\b 匹配一个单词边界,也就是指单词和空格间的位置。例如,「er\b」可以匹配「never」中的「er」,但不能匹配「verb」中的「er」。
\B 匹配非单词边界。「er\B」能匹配「verb」中的「er」,但不能匹配「never」中的「er」。
\cx 匹配由x指明的控制字符。x的值必须为A-Za-z之一。否则,将c视为一个原义的「c」字符。控制字符的值等于x的值最低5比特(即对3210进制的余数)。例如,\cM匹配一个或回车符。\ca等效于\u0001, \cb等效于\u0002, 等等…
\d 匹配一个数字字符。等价于[0-9]。注意正则表达式会匹配全角数字字符。
\D 匹配一个非数字字符。等价于[^0-9]。
\f 匹配一个换页符。等价于\x0c和\cL。
\n 匹配一个换行符。等价于\x0a和\cJ。
\r 匹配一个回车符。等价于\x0d和\cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。注意正则表达式会匹配全角空格符。
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于\x09和\cI。
\v 匹配一个垂直制表符。等价于\x0b和\cK。
\w 匹配包括下划线的任何单词字符。等价于「[A-Za-z0-9_]」。注意正则表达式会匹配中文字符。
\W 匹配任何非单词字符。等价于「[^A-Za-z0-9_]」。
\xnn 十六进制转义字符序列。匹配两个十六进制数字nn表示的字符。例如,「\x41」匹配「A」。「\x041」则等价于「\x04&1」。正則表达式中可以使用编码。.
\num 向后引用()一个子字符串(),该子字符串与正则表达式的第num个用括号围起来的捕捉群()子表达式()匹配。其中num是从1开始的十进制正整数,其上限可能是9、31、99甚至无限。例如:「(.)\1」匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
\nm 3位八进制数字,标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
\nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
\un Unicode转义字符序列。其中n是一个用四个十六进制数字表示的字符。例如,\u00A9匹配版权符号(©)。

Unicode处理

在.NET、、、的正则表达式中,可以用\uXXXX表示一个字符,其中XXXX为四位16进制数字。

字符的三种性质:

  • Unicode Property:字符属于标点、空格、字母等等。每个字符只能属于唯一。.NET、、和等语言支持。具体分类为:
    • 字符\p{L}
      • \p{Ll}\p{Lowercase_Letter}:小写字符(必须有大写的形式)。
      • \p{Lu}\p{Uppercase_Letter}:大写字符(必须有小写的形式)。
      • \p{Lt}\p{Titlecase_Letter}:全词首字母大写的字符。
      • \p{L&}\p{Cased_Letter}:存在大小写形式的字符(, , 的组合)。
      • \p{Lm}\p{Modifier_Letter}:音标修饰字符。
      • \p{Lo}\p{Other_Letter}:不具有大小写的字符或字形。
    • 附加符号\p{M}
      • \p{Mn}\p{Non_Spacing_Mark}:与其他字符结合,不额外占用空间的字符,例如日耳曼語元音變音。
      • \p{Mc}\p{Spacing_Combining_Mark}:与其他字符结合,额外占用空间的字符,例如馬拉雅拉姆文#元音字母及附標。
      • \p{Me}\p{Enclosing_Mark}:包含其他字符的字符,例如圆圈、方块。
    • 分隔符\p{Z}
      • \p{Zs}\p{Space_Separator}:不可見的空格,但占據空間。
      • \p{Zl}\p{Line_Separator}:分隔綫字符U+2028。
      • \p{Zp}\p{Paragraph_Separator}:分段字符U+2029。
    • 符号\p{S}
      • \p{Sm}\p{Math_Symbol}:数学符号。
      • \p{Sc}\p{Currency_Symbol}:通货符号。
      • \p{Sk}\p{Modifier_Symbol}:组合为其他字符的符号。
      • \p{So}\p{Other_Symbol}:其他符号。
    • 数值字符\p{N}
      • \p{Nd}\p{Decimal_Digit_Number}:所有文本中的数字0至9字符,不含形意符号。
      • \p{Nl}\p{Letter_Number}:看起来像字母的符号,包含罗马数字。
      • \p{No}\p{Other_Number}:上角标或下角标数字,或者其他不属于0至9的数字。不含形意符号。
    • 标点符号\p{P}
      • \p{Pd}\p{Dash_Punctuation}:任何种类的连字号或连接号。
      • \p{Ps}\p{Open_Punctuation}:任何种类开括号。
      • \p{Pe}\p{Close_Punctuation}:任何种类闭括号。
      • \p{Pi}\p{Initial_Punctuation}:任何种类开引号。
      • \p{Pf}\p{Final_Punctuation}:任何种类闭引号。
      • \p{Pc}\p{Connector_Punctuation}:连接词的标点符号,如下划线。
      • \p{Po}\p{Other_Punctuation}:其他标点符号。
    • 其它符号\p{C}(包括不可见控制字符与未用码位
      • \p{Cc}\p{Control}ASCIILatin-1控制字符0x00-0x1F0x7F-0x9F
      • \p{Cf}\p{Format}:不可见的格式化指示字符。
      • \p{Co}\p{Private_Use}:私用码位
      • \p{Cs}\p{Surrogate}UTF-16编码的代理对的一半。
      • \p{Cn}\p{Unassigned}:未被使用的码位
  • Unicode Block:按照编码区间划分字符,每个中的字符编码属于一个编码区间。例如语言\p{ InCJK_Compatibility_Ideographs },.NET语言\p{IsCJK_Compatibility_Ideographs}
  • Unicode Script:按照字符所属的书写系统来划分字符。和(版本不低于1.9)支持。例如\p{Han}表示汉字(中文字符)。

这三种性质对应的字符组补集是将开头的\p改为\P,其它不变。

POSIX字符组

POSIX字符组 说明 ASCII环境 Unicode环境
[:alnum:] 字母字符和数字字符 [a-zA-Z0-9] [\p{L&}\p{Nd}]
[:alpha:] 字母 [a-zA-Z] \p{L&}
[:ascii:] 字符 [\x00-\x7F] \p{InBasicLatin}
[:blank:] 空格字符和制表符 [ \t] [\p{Zs}\t]
[:cntrl:] 控制字符 [\x00-\x1F\x7F] \p{Cc}
[:digit:] 数字字符 [0-9] \p{Nd}
[:graph:] 空白字符之外的字符 [\x21-\x7E] [^\p{Z}\p{C}]
[:lower:] 小写字母字符 [a-z] \p{Ll}
[:print:] 类似[:graph:],但包括空白字符 [\x20-\x7E] \P{C}
[:punct:] 标点符号 [][!"#$%&'()*+,./:;<=>?@\^_`{|}~-] [\p{P}\p{S}]
[:space:] 空白字符 [ \t\r\n\v\f] [\p{Z}\t\r\n\v\f]
[:upper:] 大写字母字符 [A-Z] \p{Lu}
[:word:] 字母字符 [A-Za-z0-9_] [\p{L}\p{N}\p{Pc}]
[:xdigit:] 十六进制字符 [A-Fa-f0-9] [A-Fa-f0-9]

優先權

 優先權 符號
最高 \
()(?:)(?=)[]
*+?{n}{n,}{n,m}
^$、中介字符
次最低 串接,即相邻字符连接在一起
最低 |

範例

  • 以下使用PHP語言
  • 驗證字串是否只含數字與英文,字串長度並在4~16個字元之間:
    <?php
    $str = 'a1234';
    if (preg_match("/^[a-zA-Z0-9]{4,16}$/", $str)) {
        echo "CONFIRM";
    } else {
        echo "FAILED";
    }
    ?>
    
  • 簡易的中華民國國民身分證字號驗證:
    <?php
    $str = 'a1234';
    if (preg_match("/^[A-Za-z][1289]\d{8}$/", $str)) {
        echo "CONFIRM";
    } else {
        echo "FAILED";
    }
    ?>
    
  • 以下使用Perl語言
  • 驗證字串是否只含數字與英文,字串長度並在4~16個字元之間:
    print $str = "a1234" =~ m:^[a-zA-Z0-9]{4,16}$: ? "CONFIRM" : "FAILED";
    
  • 簡易的中華民國身份證字號驗證:
    print $str = "a1234" =~ m"^\w[1289]\d{8}$" ? "CONFIRM" : "INVALID";
    
  • 使用正则表示式匹配ip地址:
    import re
    s=' 192.137.1.336  192.168.1.137.123  192.168.1.138 '
    print(re.findall(r'(?<![\.\d])(?:25[0-5]\.|2[0-4]\d\.|[01]?\d\d?\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)(?![\.\d])',s))
    

相關條目

注释

  1.  命名字符类。对于C++11的regex_traits::lookup_classname,缺省返回字符类的名字:"alnum", "apha", "blank", "cntrl", "digit", "graph", "lower", "print", "punct", "space", "upper", "xdigit", "d", "s", "w"
  2.  命名字符类与最多只能向后引用到9
  3.  Visual C++的库最多只能向后引用到31
  4.  ECMAScript不限向后引用的上限

参考文献

  1.  . 國家教育研究院. [2018-12-24]. (原始内容存档于2018-12-24).
  2.  . 社群編輯. [2023-06-10]. (原始内容存档于2023-06-06). 已忽略文本“ MDN” (帮助)
  3.  . 師友會電子報第 181 期. 財團法人中華民國電腦技能基金會. 2009-11-25. (原始内容存档于2023-06-10).
  4.  . Emurasoft, Inc. (原始内容存档于2023-03-29).
  5.  . [2017-09-19]. (原始内容存档于2021-04-01).

外部链接

維基教科書中的相關電子:正则表达式
维基数据上的相关属性:

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.

おすすめ

転載: blog.csdn.net/weixin_40191861/article/details/132857738