Open4
正規表現
アンカー
- 入力文字列内での位置を示すもの
アンカー | 説明 |
---|---|
^ | 行頭 |
$ | 行末 |
$ cat test.txt
taro
takako
jiro
saburo
hanako
sachiko
akiko
$ grep '^t' test.txt # 行頭tの文字
taro
takako
$ grep 'o$' test.txt #行末oの文字
taro
takako
jiro
saburo
hanako
sachiko
akiko
$ grep '^t..o$' test.txt #行頭tで行末o、その間に任意の2文字が存在
taro
$ grep 't.*o$' test.txt #行頭tで行末o、その間に任意の文字列が存在
taro
takako
$ grep '^t*' test.txt #行頭がt、もしくはtでない任意の文字列
taro
takako
jiro
saburo
hanako
sachiko
akiko
量指定子
- 「直前に記述した正規表現が難解繰り返すか」を指定するメタ文字
- 例えば日本の郵便番号は「
\d{3}-\d{4}
」と表現できる
量指定子 | 説明 | 正規表現の例 | マッチする例 |
---|---|---|---|
. | 任意の一文字 | . | a |
* | 直前に記述した要素の0回以上の繰り返し、最長一致 | go*gle | ggle, go...gle |
+ | 直前に記述した要素の1回以上の繰り返し、最長一致 | go+gle | gogle, go...gle |
? | 直前に記述した要素の0回または1回、最長一致 | go?gle | ggle, gogle |
{n} | 直前に記述した要素のn回の繰り返し | a{3} | aaa |
{n,m} | 直前に記述した要素のn回からm回の繰り返し | a{3, 4} | aaa, aaaa |
{n,} | 直前に記述した要素のn回以上の繰り返し | a{3, } | aaa, aaaa.... |
grep
cオプション
- マッチした行の行数のみ表示
-
nオプション
は先頭に行番号をつけて、マッチした行を表示なので注意
マッチした行の行数のみ表示
$ grep -c grep test.txt
3
iオプション
- 大文字と小文字を区別しない
大文字と小文字を区別しない
$ grep -i '[a-z]' test.txt
NAME
grep, egrep, fgrep - print lines matching a pattern
SYNOPSIS
grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]
nオプション
- 先頭に行番号をつけて、マッチした行を表示
行番号をつけてマッチした行を表示
$ grep -n '[a-z]' test.txt
2:grep, egrep, fgrep - print lines matching a pattern
4:grep [options] PATTERN [FILE...]
5:grep [options] [-e PATTERN | -f FILE] [FILE...]
vオプション
- マッチしなかった行を表示
小文字でマッチしなかった行を表示
$ grep -v '[a-z]' test.txt
NAME
SYNOPSIS
Fオプション
- 検索パターンを正規表現ではなく、固定文字列とする
.*をgrepする
$ cat test.txt
a
.*
$ grep '.*' test.txt # 正規表現として任意の一文字と解釈されるので、aもマッチする
a
.*
$ grep -F '.*' test.txt
.*
$ fgrep '.*' test.txt
.*
$ grep '\.\*' test.txt # \で次の一文字をエスケープする
.*
先読みと後読み
- マッチするかどうかは確認するが、マッチした文字列としては取得しない
- 以下の種類がある
パターン | タイプ | マッチ |
---|---|---|
X(?=Y) |
肯定先読み(Positive lookahead) | Xを探すけどYが続く場合にだけマッチ |
X(?!Y) |
否定先読み(Negative lookahead) | Xを探すけどYが続かない場合にだけマッチ |
(?<=Y)X |
肯定後読み(Positive lookbehind) | Xの前にYがある場合のみマッチ |
(?<!Y)X |
否定後読み(Negative lookbehind) | Xの前にYがない場合のみマッチ |
const loolahead = /東京都(?=港区)/; // 肯定先読み: 東京都の直後に港区が続く場合にマッチ
console.log(loolahead.test('東京都港区')); // -> true
let result = loolahead.exec('東京都港区')
console.log(result !== null ? result[0] : null); // -> 東京
console.log(loolahead.test('名古屋市港区'));// -> false
const lookbehind = /(?<=東京都)港区/; // 肯定後読み: 港区の直前に東京がある場合マッチする
console.log(lookbehind.test('東京都港区')); // -> true
let result1 = lookbehind.exec('東京都港区')
console.log(result1 !== null ? result1[0] : null); // -> 港区
console.log(lookbehind.test('名古屋市港区'));// -> false