UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

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);