1. 導入:なぜNegative Lookbehindが必要なのか
Javaで文字列操作を行う際、「特定のパターンの直前には、特定の文字が含まれていないこと」を確認したい場面は意外と多いものです。例えば、「特定の接頭辞が付いていない数値だけを抽出したい」といったケースです。単純な正規表現では「マッチした後に後から確認する」という複雑なロジックになりがちですが、Negative Lookbehind(否定の後戻り)を使えば、正規表現のエンジンにその判定を任せることができ、コードを劇的に簡潔に保つことができます。
2. 基礎知識:Negative Lookbehindとは
正規表現において、Lookbehind(後戻り)は現在位置より「前方の文字列」を評価する仕組みです。
その中でもNegative Lookbehind (?は、「現在位置の直前がXではない場合のみマッチする」という条件を定義します。
・(?:直前がXでないことを確認(消費はしない)
・Pattern/Matcherクラス:Javaのjava.util.regexパッケージでは、これらの高度な正規表現構文が標準でサポートされています。
3. 実装/解決策:特定の条件を除外した検索
例えば、ログファイルから「エラーコードではない数値」を抽出したい場合、「’ERR-‘という文字列が直前に付いていない数字」を探すという条件になります。これにNegative Lookbehindを利用すると、非常に直感的に条件を記述できます。
4. サンプルプログラム
以下のコードは、`ERR-`という文字列が直前に付いていない数値のみを抽出する実用的な例です。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
// テキスト内に数値が混在
String text = “ID:100, ERR-200, ID:300, ERR-400”;
// (?5. 応用・注意点:現場でハマらないために
Negative Lookbehindを使用する際、必ず知っておくべき重要な制限が一つあります。それは「固定長(Fixed-length)でなければならない」という点です。
Javaの正規表現エンジンでは、(?

コメント