早めの結論
特定の単語を含まない行はこれ
^(?!.*pattern).+$
何の記事なの ?
abcdef と abcxyz の内,
abcxyz だけ検索したいのになぁ...
みたいな事ありますよね
そんなあなたの願いを叶える記事です
先読みと後読み
- 先読みは右から左に読んで検索するイメージ
- 後読みは左から右に戻って検索するイメージ
肯定否定
- 肯定はパターンに一致するもの
- 否定はパターンに一致しないもの
肯定先読み
(?=pattern)
右に pattern がある文字列を検索です
肯定先読みの例
target の後ろに _pattern がある文字列のみ検索
target(?=_pattern)
- target: (対象外)
- target_pattern: (対象)
- pattern_target: (対象外)
- pattern_target_pattern: (対象)
否定先読み
(?!pattern)
右に pattern がない文字列を検索です
肯定先読みの例
target の後ろに _pattern がない文字列のみ検索
target(?!_pattern)
- target: (対象)
- target_pattern: (対象外)
- pattern_target: (対象)
- pattern_target_pattern: (対象外)
肯定後読み
(?<=pattern)
左に pattern がある文字列を検索です
肯定後読みの例
target の前に pattern_ がある文字列のみ検索
(?<=pattern_)target
- target: (対象外)
- target_pattern: (対象外)
- pattern_target: (対象)
- pattern_target_pattern: (対象)
否定後読み
(?<!pattern)
左に pattern がない文字列を検索です
否定後読みの例
target の前に pattern_ がない文字列のみ検索
(?<!pattern_)target
- target: (対象)
- target_pattern: (対象)
- pattern_target: (対象外)
- pattern_target_pattern: (対象外)
pattern を含まない行
pattern を含まない行を検索するぎょ~ (意気込み)
冗談は縦置き,^(?!.*pattern).+$ で行けます
なんでこれで行けるのか見ていきましょう
^()$
()のパターンにある文字列が先頭と末尾のもの
→ () のパターンにある文字列のみの行
例を見ていきましょう
// `^(egg)$` で検索した場合
// ↓ これは egg のみの行なので対象です
egg
// ↓ これは egg のみの行ではないなので対象外です
eggham
^().+$
()のパターンにある文字列の後に,
任意の文字列 1 つ以上続く文字列が先頭と末尾のもの
→ () のパターンにある文字列のみの行
例を見ていきましょう
// `^(egg).+$` で検索した場合
// ↓ これは egg の後に文字列が 1 つ以上ある行ではないなので対象外
egg
// ↓ これは egg の後に文字列が 1 つ以上ある行なので対象
eggham
^(?!.*pattern).+$
(?!.*pattern)
この位置から見て pattern を含まない
^(?!.*pattern).+$
先頭から見て pattern を含まない行(空行除く)
参考
