正規表現とtestメソッドを使うことで合致した値を抜き出すことができる。
目次
1. / /とtest
正規表現を表す/ /
とtestメソッドを使った方法。
str = "aBc DeF 123 !!!"
res = []
for ( elem of str ){
if( /[a-z]/.test(elem) ){
res.push(elem)
}
}
console.log(res)
//["a", "c", "e"]
・/[a-z]/.test(値)
値がアルファベットの小文字(a ~ z)ならtrueを返す。
・testメソッド
正規表現.test(値)
結果はboolean。値が正規表現に一致していればtrueを返す。
・正規表現
/ /
で囲んだ中身が正規表現となる。
・[a-z]
a ~ zのいずれか1文字。
・for( a of arr )
arrから一文字づつ抜き出し変数aに代入。
for(let i = 0; i < arr.length; i++){ arr[i] }
と同じ。
## 2. 変数とtest No.1の正規表現を変数に置き換えることもできる。
str = "aBc DeF 123 !!!"
res = []
re = /[a-z]/
for ( elem of str ){
if( re.test(elem) ){
res.push(elem)
}
}
console.log(res)
//["a", "c", "e"]
reはReguler Expression(正規表現)の略。
## 3. RegExpとtest `/ /`を`RegExp(" ")`に置き換えても正規表現となる。
str = "aBc DeF 123 !!!"
res = []
for ( elem of str ){
if( RegExp("[a-z]").test(elem) ){
res.push(elem)
}
}
console.log(res)
//["a", "c", "e"]
`RegExp("[a-z]")` は `/[a-z]/` と同じ。
console.log(RegExp("[a-z]"))
/*
/[a-z]/
*/
RegExp("[a-z]")
も/[a-z]/
と同様に変数に代入できる。
## 4. //とexec testメソッドではなくexecメソッドで同様の処理を行うこともできる。
正規表現.exec(値)
値が正規表現に一致すれば、その値を返す。一致しなければnullを返す。
これと、if(null)
の null は false になることを利用する。また、if(存在する値)
はtrueになる。
str = "aBc DeF 123 !!!"
res = []
for ( elem of str ){
if( /[a-z]/.exec(elem) ){
res.push(elem)
}
}
console.log(res)
// ["a", "c", "e"]
/[a-z]/.exec(elem)
がsyntaxエラーになる場合は、/[a-z]/
を変数に代入するか、RegExp("[a-z]".exec(elem))
とすれば正規表現として認識される。
## 5. //とmatch execメソッドとよく似たmatchメソッドを使っても実現できる。
値.match(正規表現)
= 正規表現.exec(値)
値が正規表現に一致すればその値を、一致しなければnullを返す。
str = "aBc DeF 123 !!!"
res = []
for( elem of str ){
if( elem.match(/[a-z]/) ){
res.push(elem)
}
}
console.log(res)
//["a", "c", "e"]
今回は小文字のアルファベットを抜き出したが、正規表現を変更すれば、数値のみ抜き出したり、パターンが一致する場合に抜き出すことができる。
### 追記 @il9437さんよりシンプルな記述を教えていただきました。
str = "aBc DeF 123 !!!"
res = str.match(/[a-z]/g)
console.log(res) // ["a", "c", "e"]
・/[a-z]/g
フラグでg (global)をつけると、2番目、3番目にマッチする部分も検索する。
ない場合は初回で終了。