2

私の質問にふさわしいタイトルを思いつくのは大変でした。まず、必要な場合に備えて、背景情報を少し紹介します。

*正規表現を使用して情報を読み取ろうとしている請求書があります。必要な情報を、アカウント、ユーティリティ、場所、税金の4つの異なるテーブルに保存します。

各請求書には1つのアカウント番号(アカウントレベル)しかないという論理です。各アカウント番号は、複数のユーティリティ(ユーティリティレベル)に関連する場合があります。各ユーティリティは複数の場所を持つことができます(この質問では1つの場所のみを想定しています)。また、各場所に複数の税金を課すことができます。*

したがって、ここにある請求書については、4つの税金(2.97の市の売上税、1.46の郡の売上税、3.44の州の売上税、および1.10のPPRTA税)がすべて「電気」ユーティリティに属していることがわかります また、4つのユーティリティ(電気、ガス、水道、廃水)が1つのアカウント番号に属し、それぞれに独自の税金が設定されていることもわかります。

以前、私はこのような単純なことを行って、1つのキャプチャグループ内のすべての税金を複数回キャプチャしていました。Tax:。 \ $(。

私が今達成しようとしているのは、特定のユーティリティに対してのみすべての税金を検索する正規表現を作成することです。繰り返しになりますが、複数の一致がある1つのキャプチャグループに含まれている必要があります。

これが私がこれまでに電気税について持っているものの例です:(?: Electric Commercial Service(?:。 \ n)?。?Tax:。* \ $(。)(?:。 \ n)?。?このサービスの合計料金)*

ご覧のとおり、これは最初の税金のみを徴収します。「電気商用サービス」と「電気サービスに関連する「このサービスの合計料金」」という言葉の間のすべての税金を徴収する方法がわかりません。

ありがとう!

4

2 に答える 2

1

ほとんどの言語では、単一の正規表現でそれを行うことはできません。キャプチャグループは、グループがワイルドカード化されている場合でも、一致配列に1つの要素のみになります。

あなたは2つのステップでそれをする必要があります。最初に正規表現(または他の手段)を使用して、単一のユーティリティの請求書の一部を抽出します。次に、その文字列内で正規表現を使用できます

Tax:.* \$([\d.]+)$

すべての税金を見つけるために。PHPでは、preg_match_allこれに一致するものをすべて見つけるために使用します。他の言語には、同等のものが必要です(g正規表現の修飾子が含まれている可能性があります)。

于 2013-03-05T19:06:42.467 に答える
1

それはワンライナーとして行うことができ、それを行うのは楽しかったですが、それは醜くなりました:

Gas Commercial Service \([\S\s]+?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?(?:[\s]+(?:(?:(?:[\w]+ )*)?(?:[\w]+)?Tax:[xX\d\.\%\s]*?\$[\d\.\s]*?\$([\d\.]*)\s*?))?

ここでデモの説明:http://regex101.com/r/fI7hU9

Electric最初の単語を変更するだけです

受け入れるように更新されましたSurTax

于 2013-03-05T20:33:47.393 に答える