Open4

正規表現

haseyuyhaseyuy

アンカー

  • 入力文字列内での位置を示すもの
アンカー 説明
^ 行頭
$ 行末
$ 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....
haseyuyhaseyuy

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 # \で次の一文字をエスケープする
.*
haseyuyhaseyuy

先読みと後読み

  • マッチするかどうかは確認するが、マッチした文字列としては取得しない
  • 以下の種類がある
パターン タイプ マッチ
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