【问题标题】:Matching a partial string with a regular expression用正则表达式匹配部分字符串
【发布时间】:2009-08-04 13:06:25
【问题描述】:

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

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

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

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

这匹配

  1. Test.Test1()
  2. C:\Projects\Project\Test.cs
  3. 37

这个正则表达式被硬编码为英语堆栈跟踪,所以如果堆栈跟踪是另一种语言,例如瑞典语,显然没有匹配:

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

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

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

这匹配

  1. Test.Test1()
  2. C:\Projects\Project\Test.cs:line
  3. 37

问题是如何匹配没有尾随 :line 的文件路径?

【问题讨论】:

    标签: .net regex


    【解决方案1】:

    您可以尝试硬编码在文件名部分的第二个位置有冒号的必要性:

    .:[^:]*
    

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

    .:?[^:]*
    

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

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

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

    【讨论】:

    • 如果您知道整行中的最后一个冒号将路径与行单词(或其他任何内容)分开,您可以尝试使用贪婪的搜索形式:so (.*):( \S+) 将匹配。然后,这将处理没有冒号的相对路径,甚至使用冒号作为路径分隔符的旧 Apple Mac 路径
    【解决方案2】:

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

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

    编辑:

    玩了一会,想出了这个:

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

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

    路径中的冒号让我愣了一秒。但这应该有

    Test.Test1() 在 $1 C:\Projects\Projects Folder\Test.cs 在 $2 拉德 3 美元 37 美元 4 美元

    【讨论】:

    • 是的,您的假设是正确的。除了可读性之外,我们的正则表达式之间还有其他区别吗?我想你的版本更有效?
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 2012-11-25
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多