1.正規表現とは何ですか
正規表現は、文字、文字を表現するために使用され、この「ルール文字列」、論理式の文字列操作、特定の事前定義された文字の組み合わせ、およびこれらの特定の文字を使用して「文字列のルール」を形成することです文字列フィルタ・ロジックのため。正規表現と別の文字列を考えると、あなたはポジティブを通して文字列から私たちが望む表現の特定の部分を取得することができます。正規表現の柔軟性、ロジックと機能はすぐに非常に単純な方法で複雑な制御文字列の量に到達することができ、非常に強いですが、接触していた人のために、それはかなりあいまいです。正規表現は、メインアプリケーションオブジェクトなので、テキストであるので、彼はテキストエディタの機会の様々な用途があります。
2.コンセプト
3.文法
あなたは、使用する可能性がある か、そして 、あなたのハードディスク上のファイルを見つけるためのワイルドカードは*。?ゼロまたは1文字のワイルドカードに一致するファイルの名前、 *ワイルドカードは、0個以上の文字に一致します。簡単な例を与える第一次の1
正規表現ルール:^ [0-9] + ABCの$
^文字列の先頭にマッチします。
[0-9] +ディジタル複数の一致する、[0-9]マッチは、「+」の文字(ここでは番号[0-9])は、1つまたは複数の前に+、一桁と一致します。
$文字の英字abc abcのABCに一致すると、入力文字列に一致するように$終了位置を終了します。
上記の正規表現は123ABC、0abcを一致させることができますが、123ABC一致しないことができ、ABC、dは、彼らは正規表現のルールに準拠していないため、
例2
正規表現の上に一致させることができます runoob、runoob1、runoob、run_oobに、しかし、一致しない RUを、それはあまりにも短い手紙が含まれているため、3未満が一致することはできません。それは一致しない runoob $を、それが特殊文字が含まれているため、。
正規表現のオンラインテストツール
https://c.runoob.com/front-end/854
https://regex101.com/($$推奨)
正規表現(正規表現)文字列の組(パターン)について説明し、特定のサブストリングを含むサブストリングマッチングを交換または文字列から削除文字列が特定の基準を満たすかどうかをチェックするために使用することができますサブストリングのように。
例えば:
-
runoo + Bは、番号の前に、等runoooooob、runoob、runooobを一致させることができる+文字が少なくとも一回(一回以上)が表示されなければならない表します。
-
runooの* bは、あなたがrunob、runoob、文字を表すアスタリスクが発生しないことのようにrunoooooobを一致させることができます、また、1回以上(0、または1、またはそれ以上)を発生することがあります。
-
colou?rは色または色と一致するが、?疑問符の前部は、文字の最大数は一度だけ現れることができる(0または1)を表します。
正規表現と同じの数式を作成する方法を構築する方法。それは、より大きな式を作成するために一緒に小さな式を組み合わせることができますメタ文字と演算子のさまざまな方法を使って、あります。コンポーネントの正規表現は、単一の文字、文字セット、選択した文字間の文字の範囲、またはすべてのこれらの構成要素の任意の組合せとすることができます。
正規表現の共通のテキスト文字によるパターン(例えば、文字Z)と特殊文字は、その(「メタ文字」と呼びます)。モードは、一個の以上の文字列を一致させるために、テキスト検索に記述されています。テンプレートとして正規表現、検索文字列と一致する文字パターン。
4.式コレクション
文字 | 説明 |
---|---|
\ | 次の文字は特殊文字、またはリテラル文字、または後方参照、または8進数のエスケープとしてマークされています。たとえば、「n 」の文字に一致しますn 「」「\n 」改行にマッチします。シリアル\\ 「」マッチング「\ 」と「\( 」マッチ( 「」 |
^ | 文字列の先頭にマッチします。オブジェクトは正規表現Multilineプロパティを設定されている場合は、^も「一致する\n 」または「\r 位置」の後に。 |
$ | 文字列の入力端にマッチします。RegExpオブジェクトのMultilineプロパティが設定されている場合、$も「一致する\n 」または「\r 前の位置。」 |
* | 先行部分式0回以上一致します。例えば、ZO *「にマッチz 」とzoo 「」* {0}に相当します。 |
+ | 直前の部分式と1回以上一致します。たとえば、「zo+ 」一致させることができます「zo 」とzoo 「」が、一致させることはできませんz 「」+ {1}と等価です。 |
? | 先行部分式0または1を一致。例えば、「do(es)? 」一致「does 」または「does 」でdo 「」?{0,1}と同等です。 |
{N} | Nは非負整数です。決定n回のマッチング。たとえば、「o{2} 」一致しない「Bob 」でのo 「」が、一致させることができます「food 2 Oで」を。 |
{N} | Nは非負整数です。少なくともn回のマッチング。たとえば、「o{2,} 」一致しない「Bob 」でのo 「」、それが一致することができます「foooood 内のすべてのOを」。「o{1,} 」に相当しますo+ 「」「o{0,} 」に相当しますo* 「」 |
{N、M} | mおよびnは、N <= M非負整数です。マッチと少なくともn回m回まで一致します。たとえば、「o{1,3} 」一致します「fooooood 最初の3 Oで」。「o{0,1} 」に相当しますo? 「」コンマと二つの数字の間にスペースなしということに注意してください。 |
? | 場合、他の修飾子に直接文字(*、+、?、{ N}、{N}、{N、M}) 場合リア、非貪欲マッチングパターン。非貪欲パターンは、検索文字列できるだけ一致し、デフォルトの貪欲なパターンは、文字列検索をできるだけ多く一致します。たとえば、文字列はoooo 「」、「o+? 」シングルにマッチしますo 「」と「o+ 」一致するすべてのo 「」 |
。 | 「マッチングに加え\ n 以外の任意の一文字」。「を含む一致させる\ n 」としての使用を含む任意の文字、「(.|\n) 」モデル。 |
(パターン) | パターンに一致し、一致を得ます。マッチから入手することができるマッチングは、収集サブマッチのVBScriptは、JScriptのは、$ 0 ... $ 9つのプロパティで使用されている中で使用されています。「を使用し、括弧文字を一致させるには\( 」または\) 「」 |
(?:パターン) | 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|) ”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies) ”就是一个比“industry|industries ”更简略的表达式。 |
(?=pattern) | 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000) ”能匹配“Windows2000 ”中的“Windows ”,但不能匹配“Windows3.1 ”中的“Windows ”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 |
(?!pattern) | 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000) ”能匹配“Windows3.1 ”中的“Windows ”,但不能匹配“Windows2000 ”中的“Windows ”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 |
(?<=pattern) | 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows ”能匹配“2000Windows ”中的“Windows ”,但不能匹配“3.1Windows ”中的“Windows ”。 |
(?<!pattern) | 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows ”能匹配“3.1Windows ”中的“Windows ”,但不能匹配“2000Windows ”中的“Windows ”。 |
x|y | 匹配x或y。例如,“z|food ”能匹配“z ”或“food ”。“(z|f)ood ”则匹配“zood ”或“food ”。 |
[xyz] | 字符集合。匹配所包含的任意一个字符。例如,“[abc] ”可以匹配“plain ”中的“a ”。 |
[^xyz] | 负值字符集合。匹配未包含的任意字符。例如,“[^abc] ”可以匹配“plain ”中的“p ”。 |
[a-z] | 字符范围。匹配指定范围内的任意字符。例如,“[a-z] ”可以匹配“a ”到“z ”范围内的任意小写字母字符。 |
[^a-z] | 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z] ”可以匹配任何不在“a ”到“z ”范围内的任意字符。 |
\b | 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b ”可以匹配“never ”中的“er ”,但不能匹配“verb ”中的“er ”。 |
\B | 匹配非单词边界。“er\B ”能匹配“verb ”中的“er ”,但不能匹配“never ”中的“er ”。 |
\cx | 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c ”字符。 |
\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_] ”。 |
\xn | 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41 ”匹配“A ”。“\x041 ”则等价于“\x04&1 ”。正则表达式中可以使用ASCII编码。. |
\num | 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1 ”匹配两个连续的相同字符。 |
\n | 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。 |
\nm | 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。 |
\nml | 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。 |
\un | 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。 |
5.常用正则表达式
用户名 | /^[a-z0-9_-]{3,16}$/ |
---|---|
密码 | /^[a-z0-9_-]{6,18}$/ |
十六进制值 | /^#?([a-f0-9]{6}|[a-f0-9]{3})$/ |
电子邮箱 | /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/ /^[a-z\d]+(\.[a-z\d]+)*@([\da-z](-[\da-z])?)+(\.{1,2}[a-z]+)+$/ |
URL | /^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ |
IP 地址 | /((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)/ /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ |
HTML 标签 | /^<([a-z]+)([^<]+)*(?:>(.*)<\/\1>|\s+\/>)$/ |
删除代码\\注释 | (?<!http:|\S)//.*$ |
Unicode编码中的汉字范围 | /^[\u2E80-\u9FFF]+$/ |
6.为什么使用正则表达式?
典型的搜索和替换操作要求您提供与预期的搜索结果匹配的确切文本。虽然这种技术对于对静态文本执行简单搜索和替换任务可能已经足够了,但它缺乏灵活性,若采用这种方法搜索动态文本,即使不是不可能,至少也会变得很困难。
通过使用正则表达式,可以:
- 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 - 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 - 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
例如,您可能需要搜索整个网站,删除过时的材料,以及替换某些 HTML 格式标记。在这种情况下,可以使用正则表达式来确定在每个文件中是否出现该材料或该 HTML 格式标记。此过程将受影响的文件列表缩小到包含需要删除或更改的材料的那些文件。然后可以使用正则表达式来删除过时的材料。最后,可以使用正则表达式来搜索和替换标记。
7.发展历史
正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。
如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。
8.应用领域
目前,正则表达式已经在很多软件中得到广泛的应用,包括 *nix(Linux, Unix等)、HP 等操作系统,PHP、C#、Java 等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。
9.推荐书籍
参考:
https://www.runoob.com/regexp/regexp-tutorial.html
https://www.w3cschool.cn/zhengzebiaodashi/regexp-tutorial.html