找到字符串之间的guid

时间:2012-10-04 20:20:48

标签: regex regex-lookarounds

问题:

尝试将所有匹配项设为guid = guid。我期待收到匹配的集合,其中一个匹配似乎:

{9659BAE5-632F-4195-BD5D-414C1F2C1066} = {6E298F2A-129A-4491-B053-F12D67561572}

我正在尝试特别匹配GlobalSection(NestedProjects) = preSolutionEndGlobalSection之间的所有guid = guid。文件中还有其他位置存在guid = guid。

以下是数据摘录:

    Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Client", "Applications\", "{297BE1A3-A6A3-4835-BB87-63B4B4E2AE0D}"
        ProjectSection(ProjectDependencies) = postProject
            {A459406A-94FF-4CA9-8183-C7472419CC7D} = {A459406A-94FF-4CA9-8183-C7472419CC7D}
        EndProjectSection
    EndProject

    GlobalSection(NestedProjects) = preSolution
        {3D84A2B1-536D-4953-B331-D86E421905E7} = {AF46FD2E-710D-49CD-A203-CB0F8B7EF415}
        {02CB05EC-6902-417E-AD50-B3910B245B22} = {2F54A6F1-5D32-4673-8AEE-B845CC622D64}
        {DE303EF0-E3B1-4BA9-8CB3-544D37D29576} = {2F54A6F1-5D32-4673-8AEE-B845CC622D64}
        {5A095236-0EE1-4480-B7A6-833ECCFE4257} = {AF070137-227F-42F7-9487-00CB26C46E04}
        {6CCA189C-0D45-4E80-8486-38AB3E625E69} = {AF070137-227F-42F7-9487-00CB26C46E04}
        {EAE3152A-C003-4E39-BFB7-B4F7CACE1606} = {AF070137-227F-42F7-9487-00CB26C46E04}
        {9659BAE5-632F-4195-BD5D-414C1F2C1066} = {6E298F2A-129A-4491-B053-F12D67561572}
    EndGlobalSection
EndGlobal

我试过的:

这是我用来匹配guid = guid

的内容
{[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}} = {[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}}

这很好,但显然不会区分比赛的位置。所以我从文件的其他部分收到其他匹配。 我一直试图像这样使用积极的外观(有很多变化):

(?<=GlobalSection\(NestedProjects\) = preSolution(\r\n|.)+?)

我是否误用了背后的东西?

1 个答案:

答案 0 :(得分:1)

我尝试使用以下正则表达式,并使用您的示例获得了正确的结果。

(?<= GlobalSection\(NestedProjects\) = preSolution(\r\n|.)+?){[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}} = {[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}}

您可能需要在正则表达式中使用RegexOptions.Multiline作为选项,因为它是C#(如果您还没有)。

修改

我用你的数据片段写了一个小测试程序。我把它加倍,以确保它在GlobalSection(NestedProjects) = preSolution之后不匹配第一组 matches仅在GlobalSection(NestedProjects) = preSolutionEndGlobalSection之间为两个部分返回了GUID。

{A459406A-94FF-4CA9-8183-C7472419CC7D} = {A459406A-94FF-4CA9-8183-C7472419CC7D}不符合我预期的匹配结果。我希望这段代码可以帮助你解决问题。

    static void Main(string[] args)
    {
        string input = System.IO.File.ReadAllText(@"c:\test\directory\test.txt");

        string pattern =
            @"(?<=GlobalSection\(NestedProjects\) = preSolution(\r\n|.)+?){[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}} = {[A-Za-z0-9]{8}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{4}-[A-Za-z0-9]{12}}";
        Regex re = new Regex(pattern, RegexOptions.Multiline);


        MatchCollection matches = re.Matches(input);

        foreach (var match in matches)
        {
            Console.Write(match);
        }

    }