match と replace のマッチング方法は違った
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
◆ match は文字列でも正規表現検索
◆ replace は文字列は文字列で検索
◆ replace は文字列は文字列で検索
match
match ではこんな感じで正規表現で検索ができます"abc".match(/a.c/)
// ["abc"]
// ["abc"]
正規表現リテラルじゃなくて 普通に文字列を書いて渡すと
"abc".match("abc")
// ["abc"]
// ["abc"]
ちゃんとマッチできています
ではここに正規表現を書いてみると?
"abc".match("a.c")
// ["abc"]
"012345".match("[0-3]*")
// ["0123"]
正規表現として検索されています// ["abc"]
"012345".match("[0-3]*")
// ["0123"]
内部で new RegExp に渡してから使ってるみたいですね
ただの文字列のつもりで「.」などの記号を書くとおかしなことになりそうです
replace
replace の場合は"abc".replace(/a.c/, function(match){
console.log("match:", match)
return "*"
})
// match: abc
// "*"
console.log("match:", match)
return "*"
})
// match: abc
// "*"
"abc".replace("a.c", function(match){
console.log("match:", match)
return "*"
})
// abc
console.log("match:", match)
return "*"
})
// abc
文字列の場合は正規表現としてマッチしません
文字列は文字列で検索されています
まとめ
match は正規表現用のマッチング(検索)する関数なので文字列でも正規表現扱いされますただの文字列で検索する場合は
含んでいるかの true/false がほしい → .includes
どこにあるか知りたい → .indexOf / .lastIndexOf
先頭が一致するか知りたい → .startsWith
末尾が一致するか知りたい → .endsWith
マッチした文字がほしい → ただの文字列検索なのでクエリ自身がマッチした文字です
という感じで専用のメソッドをつかいましょう
replace は置換用のメソッドでただの文字列も正規表現もこれひとつなので引数の型に応じて結果が変わります
言われてみると当たり前なのかもしれませんけど ミスで match に文字列を渡すように書いていて それに気づかず replace に置き換えてなぜかマッチしなくなった! という悲劇が起きるかもしれないです というか起きました
match と replace を切り替えて動きがおかしくなったら型を確認してみるといいかもです
あと search も match と一緒で文字列渡しても 正規表現として検索されます
indexOf の正規表現版です
last 版はないです