将部分字符串与正则表达式匹配

时间:2009-08-04 13:06:25

标签: .net regex

我正在尝试解析堆栈跟踪的片段,看起来非常像这样:

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

使用像这样的正则表达式按预期工作:

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

匹配

  1. Test.Test1()
  2. C:\项目\项目\ test.cs中
  3. 37
  4. 这个正则表达式是硬编码到英文堆栈跟踪,所以如果堆栈跟踪是另一种语言,显然没有匹配,例如瑞典语:

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

    为了使匹配更加语言中立,我尝试了这个正则表达式:

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

    匹配

    1. Test.Test1()
    2. C:\项目\项目\ test.cs中:行
    3. 37
    4. 问题是我如何匹配没有尾随的文件路径:line?

2 个答案:

答案 0 :(得分:2)

您可以尝试在文件名部分的第二位硬编码必须使用冒号:

.:[^:]*

在驱动器号后跟冒号后,显然不能再有任何冒号作为文件名的一部分。但是,您可能必须处理UNC路径,因此以下内容可能会解决此问题:

.:?[^:]*

使冒号可选以允许UNC路径。

因此,您对以下“:line”的文件名部分的捕获可能如下所示:

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

答案 1 :(得分:1)

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

我假设匹配之间的空格实际上匹配正则表达式中的空格。冒号可能在所有语言中都是常量,因此您只需要在冒号后匹配非空白字符

编辑:

玩了一下并想出了这个:

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

代表

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

路径上的冒号让我失去了一秒钟。但这应该有

$ 1中的Test.Test1() C:\ Projects \ Projects Folder \ Test.cs $ 2 拉3美元 37美元