web-dev-qa-db-ja.com

一致正規表現の後の次の行を選択します

私は現在、スキャンソフトウェア「DrivveImage」を使用して、各紙から特定の情報を抽出しています。このソフトウェアを使用すると、必要に応じて特定の正規表現コードを実行できます。 UltraEdit RegexEngineで実行されているようです。

次のスキャン結果が得られます。

 1. 21Sid1
 2. Ordernr
 3. E17222
 4. By
 5. Seller

文字列でテキストOrdernrを検索してから、次の行E17222を選択する必要があります。これは、スキャンしたドキュメントのファイル名になります。文字列内のこれら2つの値の正確な位置はわかりません。必要なテキストは常に次の行として続くため、Ordernrに焦点を当てる必要があるのはそのためです。

私の要件は、これが機能するために、試合結果でE17222だけが必要であるというものです。入力できるのは単純な正規表現のみです。

すでに素晴らしいスレッドがあります: 文字列を照合した後に単語を取得する正規表現

私は「\ bOrdernr\s +\K\S +」をテストしました。これはうまく機能します。

ソフトウェアが/ Kの使用を許可していないということはなかったでしょう。\Kを実装する他の方法はありますか?

継続

ただし、サンプルテキストに「Ordernr」の後ろの文字が含まれている場合、現在の回答は必要な範囲で機能しません。このサンプルのように:

21Sid1

Ordernr 1

E17222

沿って

売り手

現在のソリューションは、「次の行」ではなく「1」を取得します。これは「E17222 "。一致したグループで。この問題にさらに関与するために、それを指摘する必要がありました。

3
R0jiv4

グーグルをしましたが、私が把握できることから、REGEXP.MATCHの最後のパラメーターは使用するキャプチャグループです。つまり、\Kなしで独自の正規表現を使用し、抽出する番号にキャプチャグループを追加するだけで済みます。

 \bOrdernr\s+(\S+)

これは、番号がキャプチャグループ1に含まれることを意味します(一致全体が0にあり、これは使用したと思います)。

ドキュメントは明確ではありませんが、構文は次のようになります。

REGEXP.MATCH(<ZoneName>, "REGEX", CaptureGroup)

使用する必要があることを意味します

REGEXP.MATCH(<ZoneName>, "\bOrdernr\s+(\S+)", 1)

ただし、ここにはかなりの推測があります...;)

4
SamWhan

説明

ordernr[\r\n]+([^\r\n]+)

Regular expression visualization

この正規表現は次のことを行います。

  • ordernr部分文字列を見つける
  • ordernrキャプチャグループ1の後に行を配置します

ライブデモ

https://regex101.com/r/dQ0gR6/1

サンプルテキスト

 1. 21Sid1
 2. Ordernr
 3. E17222
 4. By
 5. Seller

サンプル一致

[0][0] = Ordernr
 3. E17222
[0][1] =  3. E17222

説明

NODE                     EXPLANATION
----------------------------------------------------------------------
  ordernr                  'ordernr'
----------------------------------------------------------------------
  [\r\n]+                  any character of: '\r' (carriage return),
                           '\n' (newline) (1 or more times (matching
                           the most amount possible))
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    [^\r\n]+                 any character except: '\r' (carriage
                             return), '\n' (newline) (1 or more times
                             (matching the most amount possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------

交互に

ルックアラウンドを使用してラインをキャプチャし、ordernrがキャプチャグループ0に含まれないようにし、\r\nのすべてのバリエーションに対応するため。

(?<=ordernr\r|ordernr\n|ordernr\r\n)[^\r\n]+

Regular expression visualization

ライブデモ

https://regex101.com/r/pA4fD4/2

21
Ro Yo Mi