正则表达式在c#中取2个字符串的部分

时间:2013-06-27 19:01:10

标签: c# regex

dir1 \ dir2 \ dir3 \ file.aspx.cs (343,49):错误CS0839:缺少参数[ C:\ dir \ dir \ dir \ dir \ namespace.namespace .namespace.namespace \ project.csproj]

我已经花了好几个小时来创建一个正则表达式来提取这个字符串的2个区域。大胆的区域是我想要捕捉的部分。

我需要将此字符串拆分为两个单独的字符串:

  1. 我喜欢第一个“(”
  2. 之前的所有内容
  3. “[”和“]”之间的所有内容,但不包括“project.csproj”
  4. 对于#1,我最接近的是(^.*\(),这将基本上捕获到第一个“(”(包括我不想要的括号)的所有内容< / p>

    对于#2,我得到的最接近的是(\[.*\]),它基本上会捕获括号内的所有内容(包括我不想要的括号)。

    上述字符串中的任何字词都可以更改为“.csproj”“C:\”和“.cs”

    上下文:这是MSBuild在编译时吐出错误的方式。通过捕获这两个部分,我可以连接它们以提供错误文件的确切链接并自动在Visual Studio中打开文件:

    System.Diagnostics.Process.Start("devenv.exe","/edit path");
    

2 个答案:

答案 0 :(得分:5)

这种模式:

(^[^(]*).*\[(.*)project.csproj]$

捕获这些群组:

  1. dir1\dir2\dir3\file.aspx.cs
  2. C:\dir\dir\dir\dir\namespace.namespace.namespace.namespace\
  3. 如果名称project.csproj文件可能更改,则可以改为使用此模式:

    (^[^(]*).*\[(.*\\)[^\\]*]$
    

    这将匹配括号内最后一个路径片段的所有内容。

答案 1 :(得分:1)

嗯,现在,括号对你没什么好处。只需将它们放在您感兴趣的部分周围:

^(.*)\(

\[(.*)\]

现在要从匹配项中排除projects.csproj,只需将其包含在.*之后:

\[(.*)projects.csproj\]

然后match.Groups(1)会在每种情况下为您提供所需的字符串(其中match是您的Match对象)。

如果projects.csproj可以是任何文件名(即您只需要最后一个反斜杠的所有内容,请使用:

\[(.*?)[^\\]*\]