109

私はこの巨大な醜い文字列を持っています:

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

正規表現を使用して断片を抽出しようとしています。Project Nameこの場合、それが示す部分まですべてを取得したいと思いますJ0000011:(11 は毎回異なる番号になります)。

これが私が遊んでいる正規表現です:

Project name:\s+(.*)\s+J[0-9]{7}:

問題は、最後にJ0000020:に到達するまで停止しないことです。

の最初の出現で正規表現を停止するにはどうすればよいJ[0-9]{7}ですか?

4

5 に答える 5

162

後に.*' ' を追加して、非貪欲にします。?

Project name:\s+(.*?)\s+J[0-9]{7}:
于 2008-08-22T14:12:01.243 に答える
15

ここで貪欲でない量指定子を使用することは、おそらく最良の解決策です。これは、貪欲な代替手段よりも効率的であるためです: 貪欲な一致は、通常、できる限り (ここでは、テキストの最後まで!) 進み、文字を次々とトレースバックします。後で来る部分を一致させようとします。

ただし、代わりに負の文字クラスを使用することを検討してください。

Project name:\s+(\S*)\s+J[0-9]{7}:

\S「空白を除くすべて」を意味し、これはまさにあなたが望むものです.

于 2008-08-22T14:15:57.287 に答える
5

まあ、".*"貪欲なセレクターです。後者の構成を使用".*?"する場合、正規表現エンジンは、すべてのステップでテキストを"."照合して、".*?". これは、たとえば の後に何も来ない場合、何に".*?"も一致しないことを意味します。

これが私が使ったものです。s元の文字列が含まれています。このコードは .NET 固有のものですが、正規表現のほとんどのフレーバーには似たようなものがあります。

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
于 2008-08-22T14:24:12.243 に答える
1

「Expresso」を使用して正規表現を試すこともお勧めします。これは、正規表現の編集とテストのための優れた (そして無料の) ユーティリティです。

その利点の 1 つは、その UI が、正規表現に不慣れな人がこれらの新しい概念を簡単に学べるように、なじみのない多くの正規表現機能を公開していることです。

たとえば、UI を使用して正規表現を作成し、「*」を選択すると、「できるだけ少ない」チェックボックスをオンにして、結果の正規表現を確認し、慣れていなくてもその動作をテストできます。前に貪欲でない表現。

サイトからダウンロードできます: http://www.ultrapico.com/Expresso.htm

高速ダウンロード: http://www.ultrapico.com/ExpressoDownload.htm

于 2008-08-22T14:17:21.603 に答える