目次
今回は行内に特定の文字が含まれていない行の検索方法についてお伝えします。
基本
「あ」が含まれていない行を検索する正規表現は以下になります。
^(?!.*あ).*$
以下の文字列を用いて、実際にやってみます。
abcde
あいうえお
かきくけこ
12345
あ
きあい
こりあ
実行結果がこちらです↓↓↓↓↓
「あ」が含まれていない下記の行がマッチしました。
abcde
かきくけこ
12345
解説
「あ」が含まれていない行を検索するために否定先読みという正規表現を使用します。
まず、否定先読みなしで考える
「^(?!.*あ).*$」(赤い部分)が否定先読みの箇所です。
否定先読みの部分を取り除いた正規表現は「^.*$」となりますが、
これは0文字以上の行という意味で、あらゆる行にマッチします。
否定先読みの分解
次に否定先読みの「(?!.*あ)」ですが、この箇所は「(?!)」と「.*あ」の部分に分解して考えます。
「(?!)」の部分が「否定先読みを始めるよ!」という意味の記号です。
「(?!」に続き、「.*あ」という検索条件を指定し、「)」で閉じて否定先読みを記述します。
「.*あ」は通常の正規表現で解釈すると、『「あ」を含む』という意味です。
否定先読みの評価
正規表現文字列「^(?!.あ).*$」の中に否定先読みが含まれる場合、その部分が優先的に評価されます。
算数のカッコのように考えてください。
否定先読み内の検索条件にマッチした場合(『「あ」を含む』にマッチした場合)、それ以降の正規表現にはマッチしなくなります。
今回の場合で言うと、否定先読みの検索条件「あ」が含まれるにマッチする行は「^.*$」の正規表現にマッチしなくなるということです。
「あ」が含まれないことを先に評価し、マッチしないことが確認できた後、「^.*$」の正規表現を評価します。
これを否定先読みと言います。
使用例
否定先読みの検索条件を色々変えてみます。
「あ」で始まらない行の検索
以下は「あ」で始まらない行を検索する正規表現です。
^(?!あ).*$
以下の文字列がマッチします。
abcde
かきくけこ
12345
きあい
こりあ
否定先読みの検索条件を「あ」のように「.*」を省いたことで、『「あ」で始まらない』という条件になります。
「あ」で終わらない行の検索
以下は「あ」で終わらない行を検索する正規表現です。
^(?!.*あ$).*$
以下の文字列がマッチします。
abcde
あいうえお
かきくけこ
12345
きあい
否定先読みの検索条件を「.*あ$」のように、末尾に「$」をつけることで『「あ」で終わらない』という条件になります。
2文字目が「あ」でない行の検索
以下は2文字目が「あ」でない行を検索する正規表現です。
^(?!.あ).*$
以下の文字列がマッチします。
abcde
あいうえお
かきくけこ
12345
あ
こりあ
否定先読みの検索条件を「.あ」とすることで、『「あ」が2文字目に来ない』という条件になります。
注意点
否定先読みは「^」や「$」と同じように位置にマッチします。
今回の後半部分を取り除いた以下の正規表現の検索結果をご覧ください。
^(?!.*あ)
検索結果は下記画像のようになります。
サクラエディタの仕様で、先頭文字にマッチしているように見えますが、実はどの文字ににもマッチしていません。
マッチしているのは行頭の位置です。
この正規表現は『「あ」が含まれていない行の行頭』という意味です。
これに後半部分の「.*$」がつくことで、「あ」を含まない行という意味になります。
正確な知識を得たいという方は理解しておいてください。
まとめ
今回は否定先読みの解説を中心に「~を含まない行」についてお伝えしました。
以下のポイントを押さえておいてください。
- 正規表現内に否定先読みが登場したら、そこが最初に評価される。
- 否定先読み内の検索条件にマッチした場合、その文字列は正規表現全体としてマッチしない。
- 否定先読みは位置にマッチする
今回は「あ」を含まない行という、あまり実用性のない例で解説を行いました。
もっと深く知りたいという方は是非色々と試して遊んでみてください。
今回は否定先読みについて詳しく解説しましたが、「肯定先読み」という逆の機能についても解説しているので、興味があればご覧ください→こちら。
正規表現についての別記事についてもご覧ください!
★検索
パスワードの正規表現の考え方
「~を含まない行」を検索する方法
「~を含む行」を検索する方法
「~で終わる」を検索する方法
「~で始まる」を検索する方法
正規表現繰り返しの考え方
最短一致検索を行う方法
否定の文字クラス
「または」検索を行う方法
環境による「\d」の動作の違いについて検証
★置換
正規表現置換の考え方
大文字⇔小文字変換を行う方法
キャメルケース⇔スネークケース変換を行う方法
CSVを囲みなし⇒囲みありに変換する方法
CSVファイルの特定のカンマ以降を削除する方法
CSVファイルの必要な箇所だけ残す方法
数字3ケタおきにカンマを挿入する方法
正規表現置換で不要な行を削除し、必要な行だけ残す方法
数字を0埋めする方法
0埋めされた数字を0埋めなしに変換する方法
ファイル名から、拡張子のみを抽出する方法
Javaで正規表現置換を行う方法
また、Udemyという動画教育プラットフォームで動画解説を行っております。
動きを確認しながら丁寧に学習したいという方は、ぜひご覧ください!
コメント