使用一个正则表达式匹配多个值?

时间:2015-02-19 07:42:02

标签: c# regex

我正在使用此正则表达式匹配此给定数据。它必须匹配每个引用名称(包含),并且如果在那里给出,它应该匹配其他值。 源数据..

<Reference Include="Interop.ERMSPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b5fdd3f42e76a9c0, processorArchitecture=MSIL">        <HintPath>C:\Program Files (x86)\Epiplex500\epiplex\Bin\SharedInterop.ERMSPlugin.dll</HintPath>
      <Private>False</Private>
</Reference>
<Reference Include="LicenseProcessing">
 <HintPath>C:\Program Files (x86)\Epiplex500\epiplex\Bin\Shared\LicenseProcessing.dll</HintPath>
</Reference>
<Reference Include="Snapshot">
      <HintPath>C:\Program Files (x86)\Epiplex500\epiplex\Bin\Shared\Snapshot.dll</HintPath>
</Reference>
    <Reference Include="System" />
    <Reference Include="System.Data" />

我正在使用这个正则表达式。

<Reference Include="(?:([^,|"]+?)[,|"]|[\s\S]*?Version=([^,]+?),[\s\S]*?PublicKeyToken=([^,|"]+)\S([^">]+?)[\s\S]*?<HintPath>([\s\S]*?)<\/HintPath>[\s\S]*?)

我需要版本,公钥和路径以及给定的名称。 它仅匹配引用名称,其他名称将被忽略。 任何人都可以帮助我。

感谢

1 个答案:

答案 0 :(得分:2)

以下是基于Microsoft.Build且仍使用正则表达式的解决方案:

右键单击 [Solution] &gt;添加引用。 添加引用... ,选择程序集&gt; 框架&gt; Microsoft.Build,然后按确定

这是代码本身(编辑:现在,它应该处理所有的参考节点):

var project = new Microsoft.Build.Evaluation.Project(@"FILE_PATH.csproj");
var references = project.Items.Where(p => p.ItemType == "Reference").Select(p => p);
foreach (var reference in references)
{
      var ReferenceName = Regex.Match(reference.EvaluatedInclude, @"^[\w\.]+(?=,\p{Zs}|$)", RegexOptions.CultureInvariant).Value;
      var version = Regex.Match(reference.EvaluatedInclude, @"(?s:(?<=Version=)([\d\.]+))", RegexOptions.CultureInvariant).Value;
      var keyToken = Regex.Match(reference.EvaluatedInclude, @"(?s:(?<=PublicKeyToken=)([\w\-]+))", RegexOptions.CultureInvariant).Value;
      var hintpath = reference.GetMetadata("HintPath") != null ? reference.GetMetadata("HintPath").EvaluatedValue : string.Empty;
}

EDIT2:如果匹配Inlcude属性中的值存在问题,您还可以使用这些正则表达式匹配所有非空格字符,然后再输入&#34;逗号+空格&#34;或者一行结束:

var ReferenceName = Regex.Match(reference.EvaluatedInclude, @"^[^\p{Zs}]+(?=,\p{Zs}|$)", RegexOptions.CultureInvariant).Value;
var version = Regex.Match(reference.EvaluatedInclude, @"(?s:(?<=Version=)([^\p{Zs}]+(?=,\p{Zs}|$)))", RegexOptions.CultureInvariant).Value;
var keyToken = Regex.Match(reference.EvaluatedInclude, @"(?s:(?<=PublicKeyToken=)([^\p{Zs}]+(?=,\p{Zs}|$)))", RegexOptions.CultureInvariant).Value;