0

私は正規表現がかなり得意だと思いたいのですが、これは私を困惑させています。国立気象局の予報速報で使用されている特定の種類の言語に一致させようとしています。Windows で Perl 5.16 を使用しています。また、このオンライン正規表現テスターを使用してテストしました。メッセージの例を次に示します。

...A SEVERE THUNDERSTORM WARNING REMAINS IN EFFECT UNTIL 1130 PM CST FOR CENTRAL LAMAR COUNTY... AT 1106 PM CST...NATIONAL WEATHER SERVICE METEOROLOGISTS WERE TRACKING A SEVERE THUNDERSTORM CAPABLE OF PRODUCING PING PONG BALL SIZE HAIL...AND DESTRUCTIVE WINDS IN EXCESS OF 70 MPH. THIS STORM WAS LOCATED NEAR BAXTERVILLE MOVING EAST AT 50 MPH. THE SEVERE THUNDERSTORM WILL BE NEAR... PURVIS BY 1115 PM CST... WEST HATTIESBURG BY 1120 PM CST...

そして、ここに私の正規表現があります:

/A SEVERE THUNDERSTORM.+?(?<hsize>QUARTER|GOLF BALL|PING PONG BALL|HALF DOLLAR)?.+?WINDS (?:IN EXCESS OF|OVER) (?<wmph>\d+) MPH.+WAS LOCATED (?:(?<dist>\d+) MILES (?<dir>\w+) OF|(?<near>NEAR)) (?<loc>[\w ]+).+MOVING (?<mdir>\w+) AT (?<mph>\d+) MPH/

問題は、hsizeパラメーターが常に空白を返すことです。オプションで貪欲にしたいのですが、決して一致しません。私はそれを非オプションにしてみました:

/A SEVERE THUNDERSTORM.+?(?<hsize>QUARTER|GOLF BALL|PING PONG BALL|HALF DOLLAR).+?WINDS (?:IN EXCESS OF|OVER) (?<wmph>\d+) MPH.+WAS LOCATED (?:(?<dist>\d+) MILES (?<dir>\w+) OF|(?<near>NEAR)) (?<loc>[\w ]+).+MOVING (?<mdir>\w+) AT (?<mph>\d+) MPH/

それはそれを一致させますが、私には意味がありません。ご覧のとおり、ワイルドカードは貪欲ではないので、何が起こっているのかわかりません。

4

2 に答える 2

5

正規表現を少し変更して、何かに一致させる前にエンジンに特殊なテキストを強制的に検索させることができます。正規表現のこの部分を変更します。

.+?(?<hsize>QUARTER|GOLF BALL|PING PONG BALL|HALF DOLLAR)?

に:

(?:.+?(?<hsize>QUARTER|GOLF BALL|PING PONG BALL|HALF DOLLAR)|.+?)

この代替により、エンジンは特別なキーワード (最初の選択肢) との一致を見つける可能性をすべて使い果たした後、何かに一致するようになります (2 番目の選択肢)。

于 2013-02-11T05:53:19.757 に答える
4
/A SEVERE THUNDERSTORM.+?(?<hsize>QUARTER|GOLF BALL|PING PONG BALL|HALF DOLLAR)?.+?WINDS/

マッチングは次のようになると思います:

  1. 見つかりまし"A SEVERE THUNDERSTORM"た。
  2. 最初に一致.+?: 最初の試行は空の文字列を使用しています。
  3. Match (?<hsize>...)?: この位置からは、空の文字列にのみ一致します。
  4. Match second .+?: 最初の試行で空の文字列が使用されています。
  5. 一致に失敗しました"WINDS"。ステップ 4 に戻ります。
  6. 何度もバックトラックし、最終的に 2 番目は から次の までの.+?文字列全体に一致します。THUNDERSTORMWINDS

したがって、バックトラッキングはステップ 3 またはステップ 2 に戻ることはありません。

THUNDERSTORMとの間のすべてのテキストをキャプチャWINDSして、後で別の正規表現を実行するか、一方または両方.+?を雹のサイズの説明と一致しないものに変更することができます。

于 2013-02-11T05:42:30.527 に答える