サーチ…


構文

  • let regex = / pattern / [ flags ]
  • let regex = new RegExp( ' pattern '、[ flags ])
  • ismatch = regex.test( ' text ')
  • 結果= regex.exec( ' text ')

パラメーター

フラグ詳細
g g lobal。すべての試合(最初の試合では戻らない)
m m個の ulti-ライン。 ^$が各行の開始/終了に一致するようにします(文字列のbegin / endだけでなく)。
私は敏感ではありません。大文字と小文字を区別しない一致([a-zA-Z]の大文字と小文字を区別しない)。
あなた u nicode:パターン文字列はUTF-16として扱われます 。また、エスケープシーケンスをUnicode文字に一致させます。
y stick y :ターゲット文字列内のこの正規表現のlastIndexプロパティで指定されたインデックスからのみ一致します(後のインデックスとの一致は試みません)。

備考

RegExpオブジェクトは、正規表現に関する知識が豊富な場合にのみ役立ちます。入門用プライマーについてはこちらご覧ください。詳細についてはMDNをご覧ください。

RegExpオブジェクトの作成

標準創作

この形式は、動的変数から正規表現を作成する場合にのみ使用することをお勧めします。

式が変更されたり、式がユーザー生成された場合に使用します。

var re = new RegExp(".*");

フラグ付き:

var re = new RegExp(".*", "gmi");

バックスラッシュの場合:(正規表現が文字列で指定されているので、これをエスケープする必要があります)

var re = new RegExp("\\w*");

静的初期化

正規表現が変更されず、ランタイムの前に式が何であるかがわかっているときに使用します。

var re = /.*/;

フラグ付き:

var re = /.*/gmi;

バックスラッシュの場合:(正規表現がリテラルで指定されているため、これをエスケープしないでください)

var re = /\w*/;

RegExpフラグ

RegExの動作を変更するには、いくつかのフラグを指定できます。フラグは、 /test/gigiを指定するなど、正規表現リテラルの末尾に追加することも、 new RegExp('test', 'gi')ようにRegExpコンストラクタの2番目の引数として指定することもできます。

g - グローバル。最初の後に停止するのではなく、すべての一致を検索します。

i - 大文字と小文字を区別しない。 /[az]/i/[a-zA-Z]/と等価です。

m - 複数行^$は、文字列全体の先頭と末尾ではなく、区切り文字としてそれぞれ\n\rを扱う各行の先頭と末尾に一致します。

6

u - Unicode。このフラグがサポートされていない場合はあなたが特定のUnicode文字を一致させる必要があります\uXXXX XXXX 16進数で文字の値です。

y - すべての連続した/隣接する一致を検索します。

.exec()とのマッチング

.exec()を使用して一致する

RegExp.prototype.exec(string)はキャプチャの配列を返します。一致しない場合はnullを返します。

var re = /([0-9]+)[a-z]+/;
var match = re.exec("foo123bar");

match.indexは3で、マッチの(ゼロベースの)位置です。

match[0]は完全一致文字列です。

match[1]は最初にキャプチャされたグループに対応するテキストです。 match[n]は、 n番目に捕捉されたグループの値になります。

.exec()を使用したループスルーの一致

var re = /a/g;
var result;
while ((result = re.exec('barbatbaz')) !== null) {
    console.log("found '" + result[0] + "', next exec starts at index '" + re.lastIndex + "'");
}

期待されるアウトプット

'a'を見つけた場合、次のexecはインデックス '2'で開始します
'a'を見つけた場合、次のexecはインデックス '5'
'a'が見つかりました。次にexecがインデックス '8'で始まります。

.test()を使用して文字列にパターンが含まれているかどうかを確認する

var re = /[a-z]+/;
if (re.test("foo")) {
    console.log("Match exists.");
}

testメソッドは、正規表現が文字列と一致するかどうかを調べるために検索を実行します。正規表現[az]+は、1つ以上の小文字を検索します。パターンは文字列と一致するため、「一致するもの」がコンソールに記録されます。

文字列でのRegExpの使用

Stringオブジェクトには、正規表現を引数として受け取る次のメソッドがあります。

  • "string".match(...
  • "string".replace(...
  • "string".split(...
  • "string".search(...

RegExpとの一致

console.log("string".match(/[i-n]+/));
console.log("string".match(/(r)[i-n]+/));

期待されるアウトプット

配列["in"]
配列["rin"、 "r"]

RegExpで置き換える

console.log("string".replace(/[i-n]+/, "foo"));

期待されるアウトプット

strfoog

RegExpで分割する

console.log("stringstring".split(/[i-n]+/));

期待されるアウトプット

配列["str"、 "gstr"、 "g"]

RegExpで検索

.search()は、一致するものが見つかったインデックスまたは-1を返します。

console.log("string".search(/[i-n]+/));
console.log("string".search(/[o-q]+/));

期待されるアウトプット

3
-1

文字列一致をコールバック関数に置き換える

String#replaceは、第2引数として関数を持つことができるので、ロジックに基づいて置換を提供できます。

"Some string Some".replace(/Some/g, (match, startIndex, wholeString) => {
  if(startIndex == 0){
    return 'Start';
  } else {
    return 'End';
  }
});
// will return Start string End

1行のテンプレートライブラリ

let data = {name: 'John', surname: 'Doe'}
"My name is {surname}, {name} {surname}".replace(/(?:{(.+?)})/g, x => data[x.slice(1,-1)]);

// "My name is Doe, John Doe"

RegExpグループ

JavaScriptでは、正規表現、 キャプチャグループ非キャプチャグループルックアヘッドのいくつかのタイプのグループがサポートされています。現在、 ルック・バック・サポートはありません。

キャプチャー

場合によっては、目的のマッチはコンテキストに依存します。これは、単純なRegExpが関心のある文字列をオーバー検索することを意味するので、解決策はキャプチャグループ(pattern)を書くことです。キャプチャされたデータは、次に参照することができます...

  • 文字列置換"$n" nキャプチャグループn番目である(から始まる1
  • コールバック関数のn番目の引数
  • 正規表現は、フラグが立てられていない場合g返さにおいて、N + 1番目の項目 str.match アレイ
  • RegExpに gフラグが立てられているgstr.matchはキャプチャを破棄し、代わりにre.execを使用します

すべての+記号をスペースで置き換える必要がある文字列があるとしますが、文字が文字に続く場合に限ります。つまり、単純なマッチにはその文字が含まれ、それも削除されます。それをキャプチャすることは、合った文字を保存できるという意味での解決策です。

let str = "aa+b+cc+1+2",
    re = /([a-z])\+/g;

// String replacement
str.replace(re, '$1 '); // "aa b cc 1+2"
// Function replacement
str.replace(re, (m, $1) => $1 + ' '); // "aa b cc 1+2"

ノンキャプチャ

フォーム(?:pattern)を使用すると、グループの内容を格納しない以外は、グループを取得する場合と同様に動作します。

インデックスを移動したくない他のデータがキャプチャされているが、ORなどの高度なパターンマッチングを行う必要がある場合は、これらは特に便利です。

let str = "aa+b+cc+1+2",
    re = /(?:\b|c)([a-z])\+/g;

str.replace(re, '$1 '); // "aa+b c 1+2"

先のことを考える

目的の一致がそれに続くものに頼っている場合、それをマッチさせてキャプチャするのではなく、先読みを使ってそれをテストすることは可能ですが、マッチにそれを含めません。正のルックアヘッドには(?=pattern) 、負のルックアヘッド(ルックアヘッドパターンが一致しない場合にのみ式一致が起こる)があり(?!pattern)

let str = "aa+b+cc+1+2",
    re = /\+(?=[a-z])/g;

str.replace(re, ' '); // "aa b cc+1+2"

Regex.exec()をカッコで正規表現regexを使用して文字列の一致を抽出する

場合によっては、単に文字列を置換または削除したくない場合もあります。場合によっては、マッチを抽出して処理したいことがあります。ここでは、どのようにマッチを操作するかの例を示します。

マッチは何ですか?互換性のある部分文字列が文字列内の正規表現全体で見つかると、execコマンドは一致を生成します。マッチは配列であり、マッチした部分文字列全体とマッチするすべてのカッコで構成されます。

html文字列を想像してみてください。

<html>
<head></head>
<body>
  <h1>Example</h1>
  <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>
  Copyright <a href="https://stackoverflow.com">Stackoverflow</a>
</body>

aタグ内のすべてのリンクを抽出して取得する必要があります。最初は、ここであなたが書いた正規表現:

var re = /<a[^>]*href="https?:\/\/.*"[^>]*>[^<]*<\/a>/g;

しかし今、各リンクのhrefanchorが必要だと想像してください。そしてあなたはそれを一緒にしたい。あなたは、単に各試合のために新しい正規表現を追加することができます。また、括弧を使用することができます。

var re = /<a[^>]*href="(https?:\/\/.*)"[^>]*>([^<]*)<\/a>/g; 
var str = '<html>\n    <head></head>\n    <body>\n        <h1>Example</h1>\n        <p>Look a this great link : <a href="https://stackoverflow.com">Stackoverflow</a> http://anotherlinkoutsideatag</p>\n\n        Copyright <a href="https://stackoverflow.com">Stackoverflow</a>\n    </body>\';\n';
var m;
var links = [];

while ((m = re.exec(str)) !== null) {
    if (m.index === re.lastIndex) {
        re.lastIndex++;
    }
    console.log(m[0]); // The all substring
    console.log(m[1]); // The href subpart
    console.log(m[2]); // The anchor subpart

    links.push({
      match : m[0],   // the entire match
      href : m[1],    // the first parenthesis => (https?:\/\/.*)
      anchor : m[2],  // the second one => ([^<]*)
    });
}

ループの終わりに、 anchorhrefリンク配列があり、それを使ってマークダウンを書くことができます:

links.forEach(function(link) {
  console.log('[%s](%s)', link.anchor, link.href);
});

さらに進むには:

  • ネストされたカッコ


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow