通常の使用
一般的に使用されるメソッドには、test、exec、match、matchAll、replace、replaceAll、search があります。
テスト
// 匹配返回true,不匹配false
/e/.test("The best things in life are free!")
一致/すべて一致
グラムなし
次の文字列があるとします。
const str = 'abc${a}dfdsd${b}ddd'
{}
内部の値を取得したい
正規表現で括弧で囲まれたものはキャプチャ グループです。
'abc${a}dfdsd${b}ddd'.match(/\{(.+?)\}/)
ここで、配列の 0 番目の項目が一致した値で、最初の項目がキャプチャ グループであることがわかります。正規表現では g が追加されないため、最初の項目のみが一致します。
プラスg
g を追加すると、確かにすべて一致するようになりますが、キャプチャ グループとその他のグループ、インデックスなどの情報は表示されません。
グループ利用
キャプチャされる変数に変数を定義する?<var>
と、返される結果のグループ フィールドには次の値が含まれます。
すべて一致
グラムなし
プラスg
返されるのはイテレータです。構造化してみましょう。g を
追加して match を実行すると、すべてのキャプチャ値を取得できないことがわかりますが、matchAll は取得できます。
match と matchAll の比較:
1. match の場合、正規表現が g で変更されている場合、結果は正規表現に一致するすべての文字列のリストを返します。捕獲されたアイテムは無視されます。
2. 一致の場合、正規表現に g の変更がない場合、結果は最初に一致したものを返すだけでなく、キャプチャされたすべてのアイテムのリストも返します。
3. matchAll の場合、正規表現が g で変更されると、返される反復項目は 1 つずつ配列になります。一致した完全な文字列とキャプチャされたすべての項目に加えて、配列にはインデックス、入力、およびグループも含まれます。3 つの属性、 index は元の文字列内の現在一致する項目のインデックス位置を示し、input は入力された元の文字列を示し、groups はすべてのグループを含むオブジェクトです。
4. matchAll の場合、正規表現が g で変更されていない場合、結果の情報はポイント 3 で説明したものとまったく同じになります。ただし、そのイテレータには最初に一致する項目が 1 つだけあります。
実行する
match の戻り結果と一致する
グラムなし
/\{(.+?)\}/.exec('abc${a}dfdsd${b}ddd')
プラスg
g を付けない場合と同じであることがわかりますが、この API がグローバルな検索を実行していると言えますか?
グローバル モードでは、exec は複数回実行でき、各実行で返される結果は match 関数と同じです。そして、lastIndex の位置は通常のオブジェクトの下に記録され、一致しない場合は null が返され、lastIndex レコードは 0 になります。
したがって、これによれば、次のように走査することで必要な結果を得ることができます。
// 返回的数组
let m = null;
while((m = reg.exec(str)) != null){
// 每次匹配返回的结果
console.log(m);
// 每次匹配返回的lastIndex
console.log(reg.lastIndex);
}
// 最终为0
console.log(reg.lastIndex);
検索
一致が成功した場合は文字列内で最初に出現した正規表現のインデックスを返し、そうでない場合は -1 を返します。
グロブ パターン間の区別はありません。
交換
// 返回值是新的字符串
const newStr = string.replace(searchvalue,newvalue)
"Mr Blue has a blue house and a blue car".replace(/blue/g, "red");
replace 関数の 2 番目のパラメータ newvalue は特別であり、次の特別な文字列を持ちます。
$$ 直接量符号(就是当做'$$'字符用)
$& 与正则相匹配的字符串
$` 匹配字符串左边的字符
$’ 匹配字符串右边的字符
$1,$2,$,3,…,$n 匹配结果中对应的分组匹配结果
$の影響を排除したい場合は、以下のパラメータを持つ関数の戻り値として記述することができます。
- 最初のパラメータ: 一致した文字列
- 中央のパラメータ: 正規表現がグループ一致を使用する場合、それは複数です。それ以外の場合、そのようなパラメータはありません。
- 最後から 2 番目のパラメータ: 一致する文字列の対応するインデックス位置
- 最後のパラメータ: 生の文字列
例
const value = '123-234-234-234'
const pattern = '-'
value.replace(pattern, (item, index) => {
// item 替换元素,index 替换元素的下标
console.log(item, index)
return '/'
})
// 输出:
// - 3
// 123/234-234-234
replace と replaceAll はどう違いますか?
最初のパラメータが文字列の場合、replace は最初に一致した位置のみを置換し、replaceAll は一致したすべての位置を置換します。
最初の引数が両方とも正規表現の場合、違いはありません。