2009-08-04 9 views
0

で部分文字列のマッチング:私はかなりこのようになります。これは、スタックトレースの断片を解析しようとしている正規表現

at Test.Test1() in C:\Projects\Project\Test.cs:line 37 

このような正規表現を使用すると、意図したとおりに動作します:

at (.*?) in (.*?):line (\d*) 

これは

  1. Test.Test1()
  2. Cと一致する:\プロジェクト\プロジェクト\ Test.cs

この正規表現は、英語のスタックトレースにハードコードされているので、スタックトレースは、他の言語であれば何の試合は、スウェーデンのように、明らかに存在しない:

vid Test.Test1() i C:\Projects\Project\Test.cs:rad 37 

へ中立マッチングもっと言語を作り、私はこの正規表現を試してみた:

(.*?) .*? (.*?) (\d*) 

これは

と一致します
  1. Test.Test1()
  2. C:\プロジェクト\プロジェクト\ Test.cs:ライン:ライン

質問は、私は末尾せずにファイルのパスと一致するだろうかありますか?

答えて

2

で$ 3 37で$ 2 ラジアンでプロジェクト\プロジェクトフォルダ\ Test.cs \当然そこにドライブ文字を、次のコロンは、ファイル名の一部となり、更なるコロンすることはできません後

.:[^:]* 

:ファイル名の一部で第二位にコロンを持ちます。あなたはしかし、UNCパスに対処する必要がある場合がありますので、次はそれを修正することがあります

.:?[^:]* 

UNCパスを可能にするために、コロンはオプションになりました。

だから、とファイル名の一部のためのあなたのキャプチャ「:行」:はい、あなたの仮定が正しい

(.:?[^:]*):\S+ 
+0

私が探していたもの、歓声! –

+0

行全体の最後のコロンが行の単語からパスを区切っていることが分かっているなら、それを検索する貪欲な形式を試してみることができます:so(。*):(\ S +)これにより、コロンを使用しない相対パス、または古いApple Macパスでもコロンをパスセパレータとして使用します – Xetius

1

(。?)。? (。?):(\ S +)(\ d

私は、マッチの間のスペースが正規表現のスペースと実際に一致していると推測しています。コロンは、おそらくすべての言語で一定であるので、あなただけのコロンの後に非空白文字と一致する必要が

編集:

の周り遊びを持っていたし、この思い付いた:

.+?\s+(\S+)\s+.+?\s+(.*):(\S*)\s(\d+) 

at Test.Test1() in C:\Projects\Project Folder\Test.cs:rad 37 

パスのコロンは1秒間私を投げていました。しかし、この$ 77 Cで

Test.Test1を()が必要です:あなたはの必要性をハードコーディングしてみてください可能性が$ 4

+0

以下では、このようになります。読みやすさとは別に、正規表現間には他の違いがありますか?私はあなたのバージョンがより効率的だと思いますか? –

関連する問題