2008-08-22 2 views
37
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 J0000100: Machine name: DEV J0000100: Project file: E:\mbiek\foo.pf J0000100: Template file: E:\mbiek\foot.xdt J0000100: Job name: MBiek J0000100: Output folder: E:\foo\A0001401 J0000100: Temp folder: E:\foo\Output\A0001401 J0000100: Document 1 - Starting document J0005000: Document 1 - Text overflowed on page 1 (warning) J0000101: Document 1 - 1 page(s) composed J0000102: Document 1 - 1 page(s) rendered at 500 x 647 pixels J0000100: Document 1 - Completed successfully J0000020: 

私はこの巨大な醜い文字列を持っており、正規表現を使ってその部分を抽出しようとしています。正規表現があまりにも多く一致しています。どうすればそれを止めることができますか?

この場合、「プロジェクト名」の後に「J0000011:」と書かれた部分(毎回11が異なる数字になる)まですべてを取得したいと考えています。最後に:ここ

は、私は、問題はそれがJ0000020に到達するまで、それは停止しないということである

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

でプレーしてきた正規表現です。

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

+0

@ Jav_Rock:データを再フォーマットして、質問を変更しました。 OPのオリジナルの正規表現は、 '.'があなたが追加した改行と一致しないため、今度は必要に応じて動作します。 –

+0

申し訳ありませんが、元に戻します –

答えて

51

それの後に「?」を追加することにより、.*非貪欲を行います。ここでは非欲張り数量を使用して

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

は、それが貪欲代替よりも効率的でもあるので、おそらく最良の解決策である。一般的に貪欲なマッチできるだけ早く(ここでは本文の終わりまで!)、文字の後ろの文字をトレースして、その後に来る部分を試してみましょう。

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

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

\Sは「空白以外のすべてを意味し、これは正確に何をしたいです。

0

私はまた、あなたが「エスプレッソ」を使用して正規表現を使って実験をお勧めします - それは、ユーティリティ正規表現の編集とテストのための偉大な(そして無料)ユーティリティです。

その上の1つは、そのUIが、正規表現では使い慣れていない人々がこれらの新しい概念を簡単に学ぶことができるような多くの正規表現機能を公開していることです。

たとえば、UIを使用して正規表現を構築し、 "*"を選択すると、可能な限り少ない数のチェックボックスをオンにして正規表現を見たり、その動作をテストしたりすることができますあなたは前に非貪欲な表現に慣れていませんでした。自分のサイトからダウンロードできます

http://www.ultrapico.com/Expresso.htm

Expressのダウンロード: http://www.ultrapico.com/ExpressoDownload.htm

2

まあ、".*"は貪欲セレクタです。あなたはそれが後者の構文を使用している場合".*?"を使用して、非貪欲、正規表現エンジンは、すべてのステップでそれが".*?"後に来させるものは何でもマッチする"."試みにテキストと一致しますします。これは、例えば、".*?"の後ろに何も来なければ、何も一致しないことを意味します。

これは私が使ったものです。 sには元の文字列が含まれています。このコードは.NET固有のものですが、正規表現のほとんどの味は何か類似しています。

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value; 
関連する問題