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

.net 将部分字符串与正则表达式匹配,.net,regex,.net,Regex,我试图解析stacktrace的一个片段,它看起来很像这样: at Test.Test1() in C:\Projects\Project\Test.cs:line 37 (.:?[^:]*):\S+ 使用这样的正则表达式可以按预期的方式工作: at (.*?) in (.*?):line (\d*) 这和 Test.Test1() C:\Projects\Project\Test.cs 37 此正则表达式硬编码为英语stacktrace,因此如果stacktrace使用另一种语言,例如

我试图解析stacktrace的一个片段,它看起来很像这样:

at Test.Test1() in C:\Projects\Project\Test.cs:line 37 
(.:?[^:]*):\S+
使用这样的正则表达式可以按预期的方式工作:

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

  • Test.Test1()
  • C:\Projects\Project\Test.cs
  • 37
  • 此正则表达式硬编码为英语stacktrace,因此如果stacktrace使用另一种语言,例如瑞典语,则显然没有匹配项:

    vid Test.Test1() i C:\Projects\Project\Test.cs:rad 37
    
    为了使匹配更加语言中立,我尝试了以下正则表达式:

     (.*?) .*? (.*?) (\d*)
    
    这和

  • Test.Test1()
  • C:\Projects\Project\Test.cs:line
  • 37
  • 问题是在没有尾随:行的情况下如何匹配文件路径?

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

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

    编辑:

    玩了一场游戏,想出了这个:

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

    路上的冒号把我扔了一秒钟。但这本该如此

    Test.Test1()在$1中 C:\Projects\Projects Folder\Test.cs,单位为$2 3美元 37美元(.?)。?(.?):(\S+)(\d)

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

    编辑:

    玩了一场游戏,想出了这个:

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

    路上的冒号把我扔了一秒钟。但这本该如此

    Test.Test1()在$1中 C:\Projects\Projects Folder\Test.cs,单位为$2 3美元
    37在$4中,您可以努力编码在文件名部分的第二位使用冒号的必要性:

    .:[^:]*
    
    在驱动器号后面的冒号之后,显然不能再有冒号作为文件名的一部分。不过,您可能必须处理UNC路径,因此以下内容可能会解决此问题:

    .:?[^:]*
    
    这使得冒号是可选的,以允许UNC路径

    因此,下面带有“:行”的文件名部分的捕获可能如下所示:

    at Test.Test1() in C:\Projects\Project\Test.cs:line 37 
    
    (.:?[^:]*):\S+
    

    您可以尝试对在文件名部分的第二个位置使用冒号的必要性进行编码:

    .:[^:]*
    
    在驱动器号后面的冒号之后,显然不能再有冒号作为文件名的一部分。不过,您可能必须处理UNC路径,因此以下内容可能会解决此问题:

    .:?[^:]*
    
    这使得冒号是可选的,以允许UNC路径

    因此,下面带有“:行”的文件名部分的捕获可能如下所示:

    at Test.Test1() in C:\Projects\Project\Test.cs:line 37 
    
    (.:?[^:]*):\S+
    

    如果您知道整行中的最后一个冒号将路径与行字(或其他任何内容)分隔开,则可以尝试使用贪婪的搜索形式:因此(.*):(\S+)将匹配它。然后,这将处理不带冒号的相对路径,甚至使用冒号作为路径分隔符的旧Apple Mac路径。如果您知道整行中的最后一个冒号将路径与行字(或其他任何内容)分隔,您可以尝试使用贪婪的搜索形式:因此(.*):(\S+)将匹配该路径。这将处理不带冒号的相对路径,甚至使用冒号作为路径分隔符的旧Apple Mac路径。如果您的假设是正确的。除了可读性之外,我们的正则表达式之间还有其他区别吗?我认为你的说法更有效?是的,你的假设是正确的。除了可读性之外,我们的正则表达式之间还有其他区别吗?我想你的版本更有效?