2

私が得ようとしている結果に近づくのを手伝ってくれる人はいますか?

画像をスキャンした後、OCR の結果として次の文字列が返されます。

7915-03226E3058-089179 2013 年 9 月 4 日 (水) の抽選に幸運を祈ります あなたの番号 A06 09 26 40 43 45 B 06 14 18 28 43 48 C 02 16 22 34 39 42 111111 II 111111111 = 11111110 x1111 の抽選に当たります。 3.00 先週、ロトの当選者数は 700,000 人を超えました! 7915-032268058-089179 013779 用語。46377201 E - •I ボックスに入力してチケットを無効にします

"A06 09 26 40 43 45""B 06 14 18 28 43 48"、およびの値を取り出そうとしています。"C 02 16 22 34 39 42"

"A"正直に言うと、 、"B"、およびは必要ありません"C"。それぞれの後に12個の数字だけが必要です。

私はの正規表現を持っています

[A-Z](\W*\d{2}){6}

しかし、それは私が望まない余分な情報を引き出しています: http://regexr.com?372b7

誰かに近づく方法を提案できますか?チケット番号を取得するためのより良い方法はありますか?

4

3 に答える 3

5

あなたの問題は主に を中心に展開しています\W*。これは、任意の数(0を含む)の非単語文字を許可しています。したがって、基本的に 111111111111 は、大文字が前にある場合、キャプチャ グループの正規表現と正規表現全体に一致します。スペースで区切られた 2 桁のペアが必要なようです。次のようにできます。

[A-Z]\s*(\d{2}\s+){6}

デモ

ここに画像の説明を入力

\s+ペアを区切る空白文字が少なくとも 1 つあることを確認します。


上記は(オリジナルと同様に)キャプチャに最後の数字のペアのみを配置しますが。これを修正し、末尾の空白も無視するには、次のようにします。

[A-Z]\s*(\d{2}(?:\s+\d{2}){5})

デモ

ここに画像の説明を入力

(?...)が非キャプチャ グループを作成しているため、キャプチャ グループを台無しにすることなく繰り返しを実行できることに注意してください。これで、6 つの数字のペアすべてがキャプチャ グループ 1 に入れられます (これが唯一の余分なキャプチャになります)。\s*また、 afterの理由は[A-Z]、先頭文字の後にオプションの空白があるように見えるためです。

于 2013-11-05T13:50:15.030 に答える
2
[A-Z]\s*([0-9]{2}\s+){6}

任意の大文字、任意の数のスペース (またはなし)、任意の 2 桁の数字と 1 つ以上のスペース、6 回

于 2013-11-05T13:53:18.910 に答える
2

これを試して。1 つの文字、オプションのスペース、6 つの 2 桁の数字。これらの間には少なくとも 1 つのスペースが必要ですが、最後にスペースを入れる必要はありません。

[A-Z]\s*((\d{2}\s+){5}\d{2})

デモ

アップデート:

A/B/C/文字の部分は特に取得したくないとおっしゃいましたね。正規表現エンジンがルックアラウンドをサポートしている場合は、次を使用できます。

(?<=[A-Z]\s*)((\d{2}\s+){5}\d{2})

正規表現の視覚化

Debuggex デモ

文字の後の数字のみを取得します。

更新 2: 更新 1 は機能しない可能性があります。後読みで繰り返しグループを使用できるとは思えません。最初の提案[A-Z]\s*((\d{2}\s+){5}\d{2})を使用するだけで、キャプチャ グループ 1 が目的の数値になります。

于 2013-11-05T13:53:27.133 に答える