正規表現入門 第二回 メタ文字検索

# メタ文字とは
- メタ文字とは正規表現において特別な意味を持つ文字のことで、メタキャラクタとも呼ばれることがあります。
- 規則を理解してしまえば、記憶するべき情報はそれほど多くありません。
- メタ文字そのものを検索したい場合は、検索する値を「\」でエスケースする必要があります。

``` メタ文字検索の例.js
console.log('?!?!?!'.match(/\?/g));
```

>
実行結果
[ '?', '?', '?' ]

## 単一の文字の検索 "."
- 何らかの単一文字を検索するにはピリオド(.)を使います。
- 連続でピリオドを記述した場合、「記述した数分連続した文字」が検索対象となります。

``` 2-1(単一文字の検索).js
// 1つ記述
console.log('ABC'.match(/./));
console.log('ABC'.match(/./g));

// 連続して記述
console.log('ABC'.match(/../));
console.log('ABC'.match(/../g));
console.log('ABCD'.match(/../));
console.log('ABCD'.match(/../g));

// 組み合わせて記述
console.log('ABCD'.match(/A./));
console.log('ABCD'.match(/.D/));

// 何も該当しない場合
console.log('ABC'.match(/..../));

// 全角文字や記号も対象となる
console.log('あ1!?*/-'.match(/./g));
```
> 実行結果
[ 'A', index: 0, input: 'ABC', groups: undefined ]
[ 'A', 'B', 'C' ]
[ 'AB', index: 0, input: 'ABC', groups: undefined ]
[ 'AB' ]
[ 'AB', index: 0, input: 'ABCD', groups: undefined ]
[ 'AB', 'CD' ]
[ 'AB', index: 0, input: 'ABCD', groups: undefined ]
[ 'CD', index: 2, input: 'ABCD', groups: undefined ]
null
[
  'あ', '1', '!',
  '?', '*', '/',
  '-'
]

## 文字や数字を検索　"\w"
- 何らかの文字や数字を検索するには「\w」を使います
- 半角のa～z
- 半角のA～Z
- 半角の0～9
- 半角のアンダースコア(_)

``` 2-2(文字や数字を検索).js
// 1つ記述
console.log('Aa1'.match(/\w/));
console.log('Aa1'.match(/\w/g));

// 連続して記述
console.log('Aa1'.match(/\w\w/));
console.log('Aa1'.match(/\w\w/g));
console.log('Aa1_'.match(/\w\w/));
console.log('Aa1_'.match(/\w\w/g));

// 組み合わせて記述
console.log('Aa1_'.match(/\w\w_/));
console.log('Aa1_'.match(/a\w\w/));

//全角文字やアンダースコア以外の記号は対象とならない
console.log('あ1!?*/-_'.match(/\w/g));
```
> 実行結果
[ 'A', index: 0, input: 'Aa1', groups: undefined ]
[ 'A', 'a', '1' ]
[ 'Aa', index: 0, input: 'Aa1', groups: undefined ]
[ 'Aa' ]
[ 'Aa', index: 0, input: 'Aa1_', groups: undefined ]
[ 'Aa', '1_' ]
[ 'a1_', index: 1, input: 'Aa1_', groups: undefined ]
[ 'a1_', index: 1, input: 'Aa1_', groups: undefined ]
[ '1', '_' ]

## 文字や数字以外を検索する　"\W"
- 何らかの文字や数字「以外」を検索するには「\W」を使用します
- 「\w」と真逆の結果を得るためのパターンです

``` 2-3(文字や数字以外を検索する).js
// 1つ記述
console.log('A!_?'.match(/\W/));
console.log('A!_?'.match(/\W/g));

// 連続して記述
console.log('A!?*'.match(/\W\W/));
console.log('A!?*/'.match(/\W\W/));
console.log('A!?*/'.match(/\W\W/g));

// 組み合わせて記述
console.log('A!?*/'.match(/\w\W/));
console.log('A!?*/'.match(/\W\?/));

// 全角文字やアンダースコア以外の記号が対象となる
console.log('あ1!?*/-_'.match(/\W/g));
```

> 実行結果
[ '!', index: 1, input: 'A!_?', groups: undefined ]
[ '!', '?' ]
[ '!?', index: 1, input: 'A!?*', groups: undefined ]
[ '!?', index: 1, input: 'A!?*/', groups: undefined ]
[ '!?', '*/' ]
[ 'A!', index: 0, input: 'A!?*/', groups: undefined ]
[ '!?', index: 1, input: 'A!?*/', groups: undefined ]
[ 'あ', '!', '?', '*', '/', '-' ]

## 数字を検索する "\d"
- 半角数字「だけ」を検索するには「\d」を使います。

``` 2-4(数字を検索する).js
// 1つ記述
console.log('A12'.match(/\d/));
console.log('A12'.match(/\d/g));

// 連続して記述
console.log('A12'.match(/\d\d/));
console.log('A1234'.match(/\d\d/));
console.log('A1234'.match(/\d\d/g));

```
> 実行結果
[ '1', index: 1, input: 'A12', groups: undefined ]
[ '1', '2' ]
[ '12', index: 1, input: 'A12', groups: undefined ]
[ '12', index: 1, input: 'A1234', groups: undefined ]
[ '12', '34' ]

## 数字以外を検索する "\D"
- 半角数字以外を検索するには「\D」を使用する
- 「\d」と真逆の結果が得られます。

``` 2-5(数字以外を検索する).js
// 1つ記述
console.log('A1B'.match(/\D/));
console.log('A1B'.match(/\D/g));

// 連続して記述
console.log('AB1'.match(/\D\D/));
console.log('ABCD1'.match(/\D\D/));
console.log('ABCD1'.match(/\D\D/g));

```
> 実行結果
[ 'A', index: 0, input: 'A1B', groups: undefined ]
[ 'A', 'B' ]
[ 'AB', index: 0, input: 'AB1', groups: undefined ]
[ 'AB', index: 0, input: 'ABCD1', groups: undefined ]
[ 'AB', 'CD' ]

## ラインフィードを検索 "\n"
- ラインフィード(改行文字)を検索するには「\n」を使います。

``` 2-6(ラインフィードを検索).js
console.log(/\n/.test('hoge\nfuga'));
```

> 実行結果
true

## キャリッジリターンを検索 "\r"
- キャリッジリターン（復帰文字）を検索するには「\r」を使います。

``` 2-7(キャリッジリターンを検索).js
console.log(/\r/.test('hoge\rfuga'));
```
> 実行結果
true

## タブ文字を検索 "\t"
- タブ文字を検索するには「\t」を使います

``` 2-8(タブ文字を検索).js
console.log(/\t/.test('hoge\tfuga'));
```
> 実行結果
true

## 改ページを検索 "\f"
- 改ページを検索するには「\f」を追加います

``` 2-9(改ページを検索).js
console.log(/\f/.test('hoge\ffuga'));
```
> 実行結果
true

## 空白を検索 "\s"
- 空白を検索するには「\s」を使います。
- 半角/全角スペース
- タブ
- 改行
- 改ページ

``` 2-10(空白を検索).js
console.log('A B'.match(/\s/));
console.log("A \tB".match(/\s/g));
console.log("A\t\tB".match(/\s\s/));
console.log("\t  \tA".match(/\s\s/));
console.log("\t  \tA".match(/\s\s/g));
```
> 実行結果
[ ' ', index: 1, input: 'A B', groups: undefined ]
[ ' ', '\t' ]
[ '\t\t', index: 1, input: 'A\t\tB', groups: undefined ]
[ '\t ', index: 0, input: '\t  \tA', groups: undefined ]
[ '\t ', ' \t' ]

## 空白以外を検索 "\S"
- 空白「以外」を検索するには「\S」を使います。

``` 2-11(空白以外を検索).js
console.log('A B'.match(/\S/));
console.log("A \tB".match(/\S/g));
console.log("\t\tAB".match(/\S\S/));
console.log("\tABCD".match(/\S\S/));
console.log("\tABCD".match(/\S\S/g));
```
> 実行結果
[ 'A', index: 0, input: 'A B', groups: undefined ]
[ 'A', 'B' ]
[ 'AB', index: 2, input: '\t\tAB', groups: undefined ]
[ 'AB', index: 1, input: '\tABCD', groups: undefined ]
[ 'AB', 'CD' ]

## 単語の境目を検索 "\b"
- 文字列中の単語の境目を検索するには「\b」を使います。
- 「単語の境目」とは単語を構成する文字(a～z、A～Z、0～9、_)とそれ以外の文字との境目のこと

``` 2-12(単語の境目を検索).js
console.log("This IS a pen!".match(/\bis/));
console.log("This IS a pen!".match(/\bis/i));
console.log("This IS a pen!".match(/pen\b/));
console.log("This IS a pen!".match(/pen\b!/));
console.log("This IS a pen!".match(/\bT/));
console.log("This IS a pen!".match(/!\b/));
```
> 実行結果
null
[ 'IS', index: 5, input: 'This IS a pen!', groups: undefined ]
[ 'pen', index: 10, input: 'This IS a pen!', groups: undefined ]
[ 'pen!', index: 10, input: 'This IS a pen!', groups: undefined ]
[ 'T', index: 0, input: 'This IS a pen!', groups: undefined ]
null

## 単語の境目以外を検索 "\B"
- 単語の境目「以外」を検索するには「\B」を使います。
- 大文字の表記なので、「\b」と真逆の結果が得られます。

``` 2-13(単語の境目以外を検索).js
console.log("This IS a pen!".match(/\Bis/i));
console.log("This IS a pen!".match(/\BIS/));
console.log("This IS a pen!".match(/pen\B/));
console.log("This IS a pen!".match(/pen\B!/));
console.log("This IS a pen!".match(/\BT/));
console.log("This IS a pen!".match(/!\B/));
```
> 実行結果
[ 'is', index: 2, input: 'This IS a pen!', groups: undefined ]
null
null
null
null
[ '!', index: 13, input: 'This IS a pen!', groups: undefined ]

## nullを検索 "\0"
- null文字を検索するには「\0」を使います。

``` 2-14(nullを検索する).js
console.log("abcAB\u0000CaBc".match(/ab/gi));
console.log("abcAB\u0000CaBc".match(/ab\0/gi));
```
> 実行結果
[ 'ab', 'AB', 'aB' ]
[ 'AB\u0000' ]

# 参考URL
- [サンプルソース](https://github.com/shusuke-nakamura/regular_expression/tree/master/src)

# 次回予告
- [数量詞を用いた検索](https://qiita.com/shuchan/items/f706a092a2f2e55e9b43)