サーチ…
構文
- 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オブジェクトの作成
標準創作
この形式は、動的変数から正規表現を作成する場合にのみ使用することをお勧めします。
式が変更されたり、式がユーザー生成された場合に使用します。
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/gi
でgi
を指定するなど、正規表現リテラルの末尾に追加することも、 new RegExp('test', 'gi')
ようにRegExp
コンストラクタの2番目の引数として指定することもできます。
g
- グローバル。最初の後に停止するのではなく、すべての一致を検索します。
i
- 大文字と小文字を区別しない。 /[az]/i
は/[a-zA-Z]/
と等価です。
m
- 複数行^
と$
は、文字列全体の先頭と末尾ではなく、区切り文字としてそれぞれ\n
と\r
を扱う各行の先頭と末尾に一致します。
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
フラグが立てられているg
、str.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;
しかし今、各リンクのhref
とanchor
が必要だと想像してください。そしてあなたはそれを一緒にしたい。あなたは、単に各試合のために新しい正規表現を追加することができます。また、括弧を使用することができます。
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 => ([^<]*)
});
}
ループの終わりに、 anchor
とhref
リンク配列があり、それを使ってマークダウンを書くことができます:
links.forEach(function(link) {
console.log('[%s](%s)', link.anchor, link.href);
});
さらに進むには:
- ネストされたカッコ