クイックスタート
チュートリアル
ツールと言語
リファレンス
書評
正規表現の例
数値範囲
浮動小数点数
メールアドレス
IPアドレス
有効な日付
数値日付をテキストに変換
クレジットカード番号
完全行の一致
重複行の削除
プログラミング
2つの近接した単語
落とし穴
カタストロフィックバックトラッキング
過剰な繰り返し
サービス拒否
すべてをオプションにする
繰り返しキャプチャグループ
Unicodeと8ビットの混合
このサイトについてさらに
はじめに
正規表現クイックスタート
正規表現チュートリアル
置換文字列チュートリアル
アプリケーションと言語
正規表現の例
正規表現リファレンス
置換文字列リファレンス
書評
印刷可能なPDF
このサイトについて
RSSフィードとブログ
RegexMagic—Generate regular expressions matching floating point numbers

正規表現による浮動小数点数の一致

この例では、正規表現に慣れていない人がよく犯すよくある間違いを回避する方法を示します。例として、任意の浮動小数点数を一致させる正規表現を作成してみましょう。この正規表現は、整数と、整数部分が省略された浮動小数点数の両方を一致させる必要があります。1.5e8(科学表記法で1億5000万)などの指数付きの数は一致させません。

最初に思いつくのは、次の正規表現がうまくいくように思えることです。[-+]?[0-9]*\.?[0-9]*これは、浮動小数点数を、オプションの符号、それに続く一連の数字(整数部)、オプションの小数点、それに続く別のオプションの数字列(小数部)として定義しています。

正規表現を言葉で表現すると明らかになりますが、この正規表現のすべてがオプションです。この正規表現は、符号だけ、または小数点だけを有効な浮動小数点数と見なします。実際には、空文字列も有効な浮動小数点数と見なします。この正規表現を使用してファイル内の浮動小数点数を検索しようとすると、浮動小数点数がない文字列のすべての位置で長さゼロの一致が得られます。

ドットをエスケープしないこともよくある間違いです。エスケープされていないドットは、ドットを含む任意の文字に一致します。ドットをエスケープしていなければ、4.44X4はどちらも浮動小数点数と見なされます。

正規表現を作成する際には、何を一致させるべきかよりも、何を一致させるべきでないかを考慮することが重要です。上記の正規表現は、正規表現エンジンがgreedy(貪欲)であるため、適切な浮動小数点数に確かに一致します。しかし、不要なものを多く一致させるため、除外する必要があります。

より良い試みはこちらです。[-+]?([0-9]*\.[0-9]+|[0-9]+)この正規表現は、オプションの符号に一致します。これは、ゼロ個以上の数字に続くドットと1個以上の数字(整数部がオプションの浮動小数点数)、または1個以上の数字(整数)のいずれかに続きます。

これははるかに優れた定義です。一致には少なくとも1つの数字が含まれている必要があります。[0-9]+の部分を回避する方法はありません。不要な一致(数字のない一致)を正常に除外しました。

この正規表現は次のように最適化できます。[-+]?[0-9]*\.?[0-9]+.

指数付きの数にも一致させたい場合は、次を使用できます。[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?各要素をオプションにするのではなく、指数全体をグループ化することで、指数全体をオプションにしました。

最後に、特定の文字列に浮動小数点数が含まれているかどうかを検証する場合(長いテキスト内から浮動小数点数を検索するのではなく)、正規表現をアンカーする必要があります。^[-+]?[0-9]*\.?[0-9]+$または^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$これらの正規表現のバリエーションは、RegexBuddyのライブラリにあります。