freeCodeCampで正規表現を勉強する!
引き続きfreeCodeCampで正規表現も勉強。
matchとかもそうだけどエディタで検索するときにも使えるので
正規表現は結構使えるとよさそう。
検索したい文字の後ろ/後にiをつけると、大文字小文字関係なく検索してくれる
/後ろにgをつけると、同じ文字が複数はいったらリストで返してくれる
let myString = "freeCodeCamp";
let fccRegex = /freeCodecamp/i;
let result = fccRegex.test(myString);
console.log(result);
スペルミスなどやある程度おおまかな検索をしたい場合は.をつける。
.testでしか使えない?
let exampleStr = "Let's have fun with regular expressions!";
let unRegex = /.un/;
let result = unRegex.test(exampleStr);
の中に検索したい文字を入れるとその文字があると出力される。
[aoe]ならa,o,eぞれぞれ検索してくれるし、[a-z]とかならアルファベット全てを検索してくれる。
数字も可能で両方合わせることも可能。/[a-c4-6]/giならabc、456を検索してくれる。
giなので大文字小文字どちらも、同じのもリストに入れてくれる。
let quoteSample = "Beware of bugs in the above code; I have only proved it correct, not tried it.";
let vowelRegex = /[aeiou]/gi;
let result = quoteSample.match(vowelRegex);
検索されないようにするには^を先に入れる。
/[^abe0-3]/gi
同じ文字が続く場合は検索したい文字の後ろに+をつけるとまとめて検索してくれる。
s+だとsが1個以上検索、sが2個以上の場合はss+を入力
let difficultSpelling = "Mississippi's";
let myRegex = /s+/g;
let result = difficultSpelling.match(myRegex);
console.log(result); //[ 'ss', 'ss', 's' ]を返す
後ろに何個ついてようが個数を気にせず検索する場合は*を使う
let soccerWord = "gooooooooal!";
let goRegex = /go*/;
soccerWord.match(goRegex);
^はの中にいれると検索されないようにする機能を持つが、[]がないと文章の最初という意味になる。
その検索文字が最後の場合は$を検索文字の後ろにつける。
let text = "Go to school";
let text2 = "school to go";
let regex = /^school/;
let regexLast = /school$/;
console.log(regex.test(text)); //false
console.log(regex.test(text2)); //true
console.log(regexLast.test(text)); //true
console.log(regexLast.test(text2)); //false
ショートハンド
[A-Za-z0-9_]を全て含むのがめんどくさい場合は/\w/だけでショートカットできる
この場合はアンダーラインも含む。逆に含まない場合は大文字でショートカットできる/\W/
let quoteSample3 = "The five boxing wizards jump quickly.";
let alphabetRegexV2 = /\w/g;
let result3 = quoteSample3.match(alphabetRegexV2).length;
数字のみのショートカットは\d、含まない場合は\DでOK
複雑なフィルター例
let username = "JackOfAllTrades";
let userCheck = /^[a-z][a-z]+\d*$|^[a-z]+\d\d+$/gi;
let result = userCheck.test(username);
最初はアルファベット2文字以上で最後が数字いくつでも、もしくは最初の1文字以上がアルファベットで最後が2つ以上の数字で終わる
スペースを検索する場合は\s。含めない場合は\Sで
同じ文字がある範囲の数ある場合は検索したい文字の直後に{n,n}で検索できる。
最後の数字を入れなかったらn以上となる{3,}=3以上
{3}とコンマもない場合はちょうど3つということになる。
let sam = "Saaaaaaam";
let countA = /Sa{3,7}m/; //aが3~7個ある場合
let result2 = countA.test(sam);
console.log(result2);
?の使い方
?を直前の文字に入れると、その文字が0〜1個あれば検索対象に入る
let american = "color";
let british = "colour";
let rainbowRegex= /colou?r/;
rainbowRegex.test(american);
rainbowRegex.test(british);
(?=moji)で入力するとmoji部分が曖昧でも対象にしてくれる
let sampleWord = "astronaut";
let pwRegex = /(?=\w{6,})(?=\w*\d{2})/i;
let result = pwRegex.test(sampleWord);
console.log(result);
検索対象をグループしたい場合は()の中に入れる
let myString = "Eleanor Roosevelt";
let myRegex = /(Eleanor|Franklin D.)/;
let result = myRegex.test(myString);
特定しないがある文字・数字の繰り返しを検索したい場合は/(\w+)/でできる。またそれを繰り返したい場合 \1 で繰り返しができる。
単語を指定しなくていいので汎用性がある
(\w+)は変数みたいなもので.replaceとかで使いたい場合は$1,$2で対応できる
let repeatRegex = /(\w+) \1 \1/;
repeatRegex.test(repeatStr); // Returns true
repeatStr.match(repeatRegex); // Returns ["row row row", "row"]
matchで使うとリストで出力されるが1つ目が検索されたもの、2つ目が検索された単語を出力してくれる
let repeatNum = "42 42 42";
let reRegex = /^(\d+)\s\1\s\1$/; // 確実に数字が3つ、間に半角スペースがあるものを検索してくれる
let result = reRegex.test(repeatNum);
検索したものを変更したい場合は.replaceを使う。正規表現と合わせて使う
let str = "one two three";
let fixRegex = /^(\w+)\s(\w+)\s(\w+)$/; // one=$1, two=$2, three=$3となる
let replaceText = "$3 $2 $1"; // ""をの中にいれる
let result = str.replace(fixRegex, replaceText); //three two one
最初と最後のスペースを削除する方法
let hello = " Hello, World! ";
let wsRegex = /^\s+|\s+$/g; // 最初と最後に1つ以上のスペースがあれば抽出する
let result = hello.replace(wsRegex, ""); // 抽出したスペースを全てなくす
console.log(result);