2020ティーチあなたがJavaScriptの正規表現を理解します

序文

4089単語の記事では、それは12分ほどかかり読みます。

テキスト

私は多くの人が最初の正規表現の最初の印象は力の無知で見たと信じて、スターターのために、正規表現は混乱無意味な文字列の文字列です。しかし、正規表現は、それはJavascript、PHP、JavaやPythonは正規表現を持っているかどうか、非常に便利な機能です。ただ、正規表現のような小さな言語へと進化してきました。プログラミング言語の一環として、それは変数は、関数は、この概念を理解することはそう簡単ではオブジェクトを望んでいません。多くの人々は完全にインターネットから問題のコピーを解決するために頼るまでの正規表現は、ビジネスで使用される単純なマッチングに基づいている理解しています。私は確かに、ビジネスにおける問題のほとんどを解決することができますコピーによって、オープンソースコミュニティの様々な開発を、言っているが、プログラマの追求として、自分自身にCtrl + C CtrlキーVだけに頼る聞かせすることはありませんプログラミングへ。JavaScriptの正規表現に基づいて、私のコミュニティ内での個人的な思考と説明する正規表現正規表現にいくつかの優れた記事と組み合わせます。

Javascrip正規表現の使用

簡単な紹介の下では、2つの方法でJavaScriptで正規表現の使用:

  1. **コンストラクタ:**建てのRegExpコンストラクタを使用しました。
  2. リテラル**:**ダブルスラッシュ(//)。

コンストラクタを使用:

var regexConst = new RegExp('abc');

ダブルスラッシュを使用します。

var regexLiteral = /abc/;

マッチング

Javascriptの正規表現オブジェクトに二つの主な方法、テストとexecがあります。

試験()メソッドは、パラメータが文字列と一致する正規表現であり、以下の実施例を一つのパラメータを取ります。

var regex = /hello/;
var str = 'hello world';
var result = regex.test(str);
console.log(result);
// returns true

EXEC()メソッドが実行する指定された一致文字列を検索します。結果の配列はnullを返します。

var regex = /hello/;
var str = 'hello world';
var result = regex.exec(str);
console.log(result);
// returns [ 'hello', index: 0, input: 'hello world', groups: undefined ]
// 匹配失败会返回null
// 'hello' 待匹配的字符串
// index: 正则表达式开始匹配的位置
// input: 原始字符串

私たちは、テストに以下のテスト()メソッドを使用しています。

フラグ
:フラグパラメータは、検索文字列の範囲を示すために使用され、6つのフラグがある
ここに画像を挿入説明
ダブルスラッシュ構文:

var re = /pattern/flags;

コンストラクタの構文:

var re = new RegExp("pattern", "flags");

Facieインスタンス:

var reg1 = /abc/gi;
var reg2 = new RegExp("abc", "gi");
var str = 'ABC';
console.log(reg1.test(str)); // true
console.log(reg2.test(str)); // true

正規表現の考え方

正規表現は、文字列にマッチするパターンです。

、正規表現は、文字列上で動作していることを覚えて、それが一般的なプログラミング言語の文字列型を持っている、正規表現があるでしょう。

:文字列の場合、それは2つの部分で構成されたコンテンツと場所

たとえば、文字列:

'hello World';

これは、コンテンツです。

'h', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'

各個々の文字列は、文字の内容の文字列であるとして、それは位置を指す:
ここに画像を挿入説明
ポジションは、隣接文字間の位置、矢印上図の位置、すなわち参照されます。

マッチング位置に比べてコンテンツをマッチングすることは、単純なマッチング法の下で、より複雑な、見ています:

簡単な試合

最も簡単な方法は、文字列に一致するように試合を完了することです:

 var regex = /hello/;
 console.log(regex.test('hello world'));
 // true

複雑なマッチング
正規表現は(場所の試合で)一致しているどのくらいのソリューションの文字列を、一致し、誰の問題(コンテンツマッチングで)一致させるために使用される多くの特殊文字があります。誰特殊文字を決定するために、試合のいくつかを見てみましょう:

マッチしたコンテンツ
の簡単な特殊文字は
、単純に次の特殊文字の内容にマッチ:

[XYZ]:例えば、文字セット、任意の角括弧の文字マッチング:

var regex = /[bt]ear/;
console.log(regex.test('tear'));
// returns true
console.log(regex.test('bear'));
// return true
console.log(regex.test('fear'));
// return false

**注:**特殊文字^に加えて、(角括弧内)の文字セット内の他のすべての特殊文字は、その特別な意味を失うことになります。

[^ xyzが]:これは、文字セット、および括弧でないすべての文字を一致させるために使用される異なるもの、上記の文字セットです。例えば:

var regex = /[^bt]ear/;
console.log(regex.test('tear'));
// returns false
console.log(regex.test('bear'));
// return false
console.log(regex.test('fear'));
// return true

:小文字、これらの3つの非常に人気のある文字の大文字と数字だけでなく、比較的単純な言葉遣いを提供するために

\ D:[0-9]と同じ、数字に一致します。

\ D:[^ 0-9]と同じ、数字以外の文字にマッチします。

[-ZA-Z0-9_]と等価で、マッチング数字、小文字、大文字下線:\ W。

\ Wは:マッチング非数値、非小文字、大文字と非A非下線付き、[^ A-ZA-Z0-9_]と等価。

[AZ]:我々はすべての文字を一致させたい場合は、すべての文字が角括弧内に書かれている行うには愚かな方法ですが、ミス文字に非常に簡単に読みやすくするために、非常にエレガントな達成とすることは明らかです。単純な実装では、次のような文字の範囲を指定することで、ある** [ああ]また、小文字と大文字、数字、[0-9]の一致に加えて一致させることができ、Hへの手紙の文字の間のすべての文字を一致させることです0から9の数字、[AZ] **すべて大文字の間の一致Z. 例えば:

var regex = /[a-z0-9A-Z]ear/;
console.log(regex.test('fear'));
// returns true
console.log(regex.test('tear'));
// returns true
console.log(regex.test('1ear'));
// returns true
console.log(regex.test('Tear'));
// returns true

X | Y:マッチxまたはy。例えば:

var regex = /(green|red) apple/;
console.log(regex.test('green apple'));
// true
console.log(regex.test('red apple'));
// true
console.log(regex.test('blue apple'));
// false

:マッチ改行以外の任意の一文字、フラグsが改行例と一致するかどうか:

var regex = /.n/ ;
console.log(regex.test('an'));
// true
console.log(regex.test('no'));
// false
console.log(regex.test('on'));
// true
console.log(regex.test(`
n`));
// false
console.log(/.n/s.test(`
n`)); // 注意这里的正则
// true

\:これは、特殊文字をエスケープするために使用され、我々は角括弧にマッチさせたいなど、あなたが同じ試合\もエスケープする\使用することができますを逃れるために、\使用することができ、例えば:

var regex = /\[\]/;
console.log(regex.test('[]')); // true

特殊文字以上一度だけターゲット文字列を一致させることができますが、多くの場面では、我々は一致して、我々は特殊文字は、私たちのニーズを満たすことができなくなりますの上、多数のAと一致するようにしたいなど、ターゲット文字列を複数回にマッチする必要がありますそれの一部のコンテンツでは特殊文字は、この問題を解決するために使用されます。

{N}:文字マッチング括弧の前にn回。例:

var regex = /go{2}d/;
console.log(regex.test('good'));
// true
console.log(regex.test('god'));
// false

まあは、上記の正規/良い/に相当し、理解しました。

{N}:一致少なくとも括弧の前に文字n回。例:

var regex = /go{2,}d/;
console.log(regex.test('good'));
// true
console.log(regex.test('goood'));
// true
console.log(regex.test('gooood'));
// true

{N、M}:ブレース文字が少なくともn回最もm回に一致する前に。例:

var regex = /go{1,2}d/;
console.log(regex.test('god'));
// true
console.log(regex.test('good'));
// true
console.log(regex.test('goood'));
// false

使用する方が便利のために、だけでなく、書き込みのより便利な一般的に使用される3つのルールが用意されています。

*:{0}に等しいです。これは、前の文字であることを、少なくとも0回表示されます、任意の回数現れることを示しています。
+:{1}と同等。これは、前の文字が一度少なくとも表示されていることを示しています。
?:{0,1}と同等。これは、文字が表示されるか、複数回表示されていないことを示しています。

コンテンツマッチングは通常の文字の上に使用することで、需要を満たすために持っていますが、として改行、改ページ、およびキャリッジリターンおよびその他の特殊記号以上の特殊文字は、需要を満たすことができないので、正規表現マッチングはまた、特殊記号を提供するように設計されて特殊文字:

\ Sは:スペース、タブ、改ページと改行を含む、空白文字を一致させます。例を見てください:

var reg = /\s/;
console.log(reg.test(' ')); // true

\ Sは非空白文字にマッチします。

\ Tは:水平タブに一致します。

\ Nは:改行にマッチします。

\ F:ウェブサイトのページの一致。

\ R:改行を一致。

\ V:垂直タブにマッチします。

\ 0:マッチNULL(U + 0000)の文字。

[\ B]は:バックスペースにマッチします。

\ CX:XはZ、制御文字の一致文字列に文字Aの間です。

高度なコンテンツマッチ

(X):Xマッチ覚えX、括弧内に捕捉基として知られています。ブラケットは行く定期的なカッコで作成することができ、強力なサブ式を、サポートすることができ、その後、全体として一致します。これは、変数がキャプチャグループの数を記録するために使用される番号を意味している、そこと呼ばれる特殊な文字もあり、\ nは、nは、改行の前に同じではありません。例:

console.log(/(foo)(bar)\1\2/.test('foobarfoobar')); // true
console.log(/(\d)([a-z])\1\2/.test('1a1a')); // true
console.log(/(\d)([a-z])\1\2/.test('1a2a')); // false
console.log(/(\d){2}/.test('12')); // true

正規表現の交換部品では、$ 1のようなものを使用する必要があります、 2 2、...、 N-この構文、例えば、 'バーfoo'.replace(/(... 1 " 1' )。 &これは、マッチングのために全体の元の文字列を表します。

(?:X):マッチ 'X' が、試合を覚えていません。これは、非キャプチャグループと呼ばれています。ここでは\ 1は、通常の文字として、それを有効にしますなりません。例:

var regex = /(?:foo)bar\1/;
console.log(regex.test('foobarfoo'));
// false
console.log(regex.test('foobar'));
// false
console.log(regex.test('foobar\1'));
// true

マッチング位置は、
再びその位置がフロントイトゥリの矢印の位置であると強調しました。

:マッチは、私たちの前の場所のマップの最初の矢印の位置で文字列の始まり。【ご注意と XY]はされている参照してください、2つの全く異なる意味を区別例:

var regex = /^g/;
console.log(regex.test('good'));
// true
console.log(regex.test('bad'));
// false
console.log(regex.test('tag'));
// false

すなわち、文字gで始まる、通常のマッチング文字列を意味する上記の。

$:一致する文字列の終了位置、例:

var regex = /.com$/;
console.log(regex.test('[email protected]'));
// true
console.log(regex.test('test@testmail'));
// false

すなわち、終了通常の一致文字列を意味する上記.COM

\ B:単語の境界にマッチします。注マッチがワード境界、単語が前方位置または他の「単語」の文字位置に続くもう一つの「単語」の文字はないことを、この境界手段であること。これは、両側の要件は、通常の文字が不完全であるか、特殊な記号であるすべてではありません満たすための位置です。例を見てください:

console.log(/\bm/.test('moon')); // true 匹配“moon”中的‘m’,\b的左边是空字符串,右边是'm'
console.log(/oo\b/.test('moon')); // false 并不匹配"moon"中的'oo',因为 \b左边上oo,右边是n,全是正常字符
console.log(/oon\b/.test('moon')); // true 匹配"moon"中的'oon',\b左边是oon,右边是空字符串
console.log(/n\b/.test('moon   ')); // true 匹配"moon"中的'n',\b左边是n,右边是空格
console.log(/\bm/.test('   moon')); // true 匹配"moon"中的'm',\b左边是空字符串 右边是m
console.log(/\b/.test('  ')); // false 无法匹配空格,\b左边是空格或空字符串,右边是空格或是空字符串,无法满足不全是正常字符或是不全是正常字符

これは十分に理解されていない場合は、\ B、より分かり少し見ることができます。

\ B:一致が全ての両側程度であることが、非単語の境界と一致し、\ Bの逆は、すべての通常の文字や特殊記号の位置です。例を見てください:

console.log(/\B../.test('moon')); // true 匹配'moon'中的'oo' \B左边是m,右边是o
console.log(/\B./.exec('  ')); // true 匹配'  '中的' ' \B左边是空字符串,右边是空格' '

X(Y!):「X」が前方負ルックとして知られている「Y」マッチ「x」は、後ろに続いていない場合のみ。例:

var regex = /Red(?!Apple)/;
console.log(regex.test('RedOrange')); // true

(?!<Y)×:「x」の逆引きが拒否として知られている「Y」一致「X」、が先行していない場合のみです。例:

var regex = /(?<!Red)Apple/;
console.log(regex.test('GreenApple')); // true

(?=)XがY:マッチ「X」「X」「Y」が続く。これは、最初のアサーションと呼ばれている場合のみ。例:

var regex = /Red(?=Apple)/;
console.log(regex.test('RedApple')); // true

X(<= Y):マッチ「X」の場合にのみ後続アサーションと呼ばれている「X」フロント「Y」。例:

var regex = /(?<=Red)Apple/;
console.log(regex.test('RedApple')); // true

JSは、正規表現のアプローチを使用することができます
ここに画像を挿入説明
実際には
任意の10桁と一致します。

var regex = /^\d{10}$/;
console.log(regex.test('9995484545'));
// true

上記の下で定期的分析:

  1. 私たちは、文字列全体間で一致する場合、文字列は、我々はそれゆえ^使用して、$始まりと終わりを制限することができます一致させたいものを持つことはできません。
  2. 一致する\ Dの番号は、[0-9]と等価です。
  3. {10}マッチ\ Dの発現は、すなわち\ Dを10回繰り返し。

日付形式DD-MM-YYYYまたはDD-MM-YYと一致します:

var regex = /^(\d{1,2}-){2}\d{2}(\d{2})?$/;
console.log(regex.test('10-01-1990'));
// true
console.log(regex.test('2-01-90'));
// true
console.log(regex.test('10-01-190'));

定期上記の分析:

  1. 同様に、私たちは^を使用し、$始まりと終わりを制限します。
  2. 一つまたは二つの数字と一致する\ D {1,2}、。
  3. - ハイフン、特別な意味を一致させます。
  4. ()もグループを取り込むとしても知られている、部分式をラップ。
  5. {2}上記回副整合発現を示しています。
  6. \ D {2}は二つの数字と一致します。
  7. ?(\ D {2})部分式は、2つの数字と一致し、そしてその後、一致または部分式と一致しません。

下線付きの名前をオンキャメルケース:

var reg = /(\B[A-Z])/g;
'oneTwoThree'.replace(reg, '_$1').toLowerCase();

定期上記の分析:

  1. \ Bは避け、文字の最初の文字を大文字も捨てています。
  2. ([AZ])キャプチャ大文字基を捕捉しました。
  3. そして、前回のキャプチャを示すために、この構文$ nを使用して交換してください。
  4. コールtoLowerCaseメソッドは、文字を小文字。

結論
ルールを覚えにくい正規表現は、私はあなたが正規表現フォーク牛を書くことを願って、この記事では、これらの特殊文字を覚えて、より良いあなたを助けることができると思います。
上記の私自身の考えのいくつか、正しい私に関心の波を見つける方法を歓迎して共有することがあります
ここに画像を挿入説明

公開された19元の記事 ウォン称賛7 ビュー6446

おすすめ

転載: blog.csdn.net/ZYQZXF/article/details/104497797