0

私はこのテストデータを持っています:

  1. #400 - Azerjahan Husbaiによる一部の要約
  2. #343 の株 - #18 の不動産の執行者 - ホマホジュレイ
  3. #187 - Shone Jumaja から #448 - Socsa Husmai の不動産の管理者としての株式
  4. #187 - Shone Jumaja から #445 - Horo Te Fuka の不動産の管理者としての株式

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

^.*#(?<legacyId>\d*).*$

ここでのキャプチャ グループは常に #\d* の最後の出現をキャプチャするため、現在の正規表現を使用したキャプチャ グループの現在の結果セットは次のようになります。

  1. 400
  2. 18
  3. 448
  4. 445

結果セットが次のようになるように正規表現を変更したい:

  1. 400
  2. 343
  3. 448
  4. 445

ルールは、最後ではなく最初のオカレンスをキャプチャするだけであってはなりません

正と負の先読みを組み合わせて使用​​する必要があると思いますか?

4

1 に答える 1

0

使用しているプログラミング言語または正規表現ライブラリを指定していません。それは重要な情報です。それがなければ、私はあなたが利用できる機能を推測することしかできません.

あなたが与えた唯一の重要な手がかりは、名前付きキャプチャの使用でした。(?<name>)ではなく構文を使用したため(?P<name>)、正規表現のフレーバーをおそらく次のいずれかに絞り込みます。

  • 。ネット
  • Perl 5.10+
  • PCRE 7+
  • Java 7+
  • 鬼車 1.8.4+
  • Ruby 1.9+ (デフォルトで鬼車を使用)
  • Boost.Regex (これをサポートし始めたバージョンがわからない)
  • JavaScript とXRegExp 0.5+
  • RegexBuddy のような JGsoft 製品

OK、その手がかりでも十分に絞り込めませんでした。正規表現が新しいルールをサポートするための関連機能は否定的な後読みかもしれませんが、上記のすべてが後読みをサポートしているわけではなく、ほとんどすべてが後読みのさまざまな機能のサブセットをサポートしています。

以下は、固定長の負の後読みを使用して、上記の幅広いフレーバーを簡単な方法でサポートしようとするソリューションです。

^.*#(?<!estate of #)(?<legacyId>\d+)

これにより、改行でmake^とmatchを行うフラグを有効にする必要があります。$ドットが改行に一致することを許可するフラグや、フリースペースおよび行コメントのフラグを有効にしないでください。(これらのフラグは、異なる場所で異なる名前と文字を使用します。) 私は#、ちょっとした効率上の理由から、シンボルの後に否定の後読みを配置しました。

使用しているプログラミング言語と正規表現のフレーバーを人々に推測させないでください。

于 2012-05-29T14:46:10.360 に答える