C#.net正则表达式从字符串中提取字符串

时间:2017-03-14 19:10:47

标签: c# .net regex string

我有一个字符串输出,如下所示:

ID       = GC5c.U.feab4bc5-8-92e-c486eaddddf8
AESKEY1  = efbf5c9db259e345c205b0da27f6fb459D
AESKEY2  = ea85af9f1e5f42ff4fe8b9f07e7dcebc68
DESKEY1  = 6388a9e1a2fc8981189f0f412ae4e8

ID       = JNPa.T.71664548-82-be2-a51aadd4a6f3
AESKEY1  = 37af9242c8879414e420f46903c16adebd3
AESKEY2  = 1259a1f6f6da03cb3984a117ca617d9ff73
DESKEY1  = 9547dc08db70cb95789f3a59e5c6adebd31

如何迭代此列表的ID并获取字符串中的值?

5 个答案:

答案 0 :(得分:2)

打开文件,遍历每一行,并将其放入 <script type="text/javascript"> var map = null; var spotsArray = []; window.onload = initialize(); function initialize() { map = new google.maps.Map(document.getElementById("map-canvas") , { mapTypeId: google.maps.MapTypeId.roadmap , zoom: @Model.StartingZoom , disableDefaultUI: true , zoomControl: true , center: new google.maps.LatLng(@Model.StartingLocation) }); map.addListener('zoom_changed', zoomChange, this); dataLayer = new google.maps.Data({ map: map }); window.setInterval(function () { UpdateData() }, 5000); } function getScaleSize() { var scale = null; var mapZoom = map.getZoom(); switch (mapZoom) { case 15: case 16: case 17: scale = 1; break; case 18: scale = 10; break; case 19: case 20: case 21: case 22: scale = 20; break; default: scale = 0; } return scale; } function zoomChange() { for (var nIndex = 0; nIndex < spotsArray.length; nIndex++) { var Spot = spotsArray[nIndex].Spot; var Scale = getScaleSize(); Spot.icon.scale = Scale; } } function UpdateData() { GetJsonData('@Url.Action("GetMapData")' ,{} ,function(jsonData) { $(jsonData).each(function (item) { AddUpdateSpotOnMap(jsonData[item]) }); }); }; function AddUpdateSpotOnMap(SpotData) { //SpotID, Latitude, Longitude, StrokeColor, StrokeOpacity, StrokeWeight, FillColor, FillOpacity //Check if in Array var inArrayIndex = NaN; for (var nIndex = 0; nIndex < spotsArray.length; nIndex++) { if (SpotData.spotID == spotsArray[nIndex].SpotID) { inArrayIndex = nIndex; break; } } if (isNaN(inArrayIndex) == false) { //Update Color spotsArray[inArrayIndex].Spot.setOptions({ StrokeColor: SpotData.strokeColor, StrokeOpacity: SpotData.strokeOpacity, StrokeWeight: SpotData.strokeWeight, FillColor: SpotData.fillColor, FillOpacity: SpotData.fillOpacity }); } else { var Spot = new google.maps.Marker( { position: new google.maps.LatLng(SpotData.latitude, SpotData.longitude), map: map, title: SpotData.hoverOver, icon: { path: google.maps.SymbolPath.CIRCLE, strokeColor: SpotData.strokeColor, strokeOpacity: SpotData.strokeOpacity, strokeWeight: SpotData.strokeWeight, fillColor: SpotData.fillColor, fillOpacity: SpotData.fillOpacity, scale: 5 } }); spotsArray.push({ SpotID: SpotData.spotID, Spot: Spot }); dataLayer.add(Spot); } }; </script>

Dictionary<string, string>

更新:请注意,此解决方案使用的是Dictionary,因此不允许重复键。如果您需要复制密钥,我建议您更改Dictionary<string, string> data = new Dictionary<string, string>(); using(StreamReader reader = new StreamReader("C:/YourFilePath.txt")) { while (reader.Peek() >= 0) { string[] line = reader.ReadLine().Split('='); data.Add(line[0].TrimEnd(), line[1].TrimStart()); } } 的此解决方案。顺便说一下,代码会变得更脏一些:

List<KeyValuePair<string, string>>

答案 1 :(得分:1)

我不确定Regex是否适合此方案,但请在下面找到使用命名组"id"的解决方案。

var regex = new Regex(@"id.*=\s*(?<id>.+)", RegexOptions.IgnoreCase);
var input = @"ID       = Gs3c.H.feab4bc5-6c00-4ee8-9e2e-c486eaddddf8
              AESKEY1  = efbf5c9db259e345c205b0da27f6fb459D
              AESKEY2  = ea85af9f1e5f42ff4fe8b9f07e7dcebc68
              DESKEY1  = 6388a9e1a2fc8981189f0f412ae4e8

              ID       = JNPa.T.71664548-82-be2-a51aadd4a6f3
              AESKEY1  = 37af9242c8879414e420f46903c16adebd3
              AESKEY2  = 1259a1f6f6da03cb3984a117ca617d9ff73
              DESKEY1  = 9547dc08db70cb95789f3a59e5c6adebd31";

var ids = regex.Matches(input).Cast<Match>().Select(m => m.Groups["id"]);

以下是正则表达式测试:Regex test

答案 2 :(得分:0)

NicoRiff建议使用常规解析到Dictionary是可行的方法。这是强制性的基于LINQ的方法:

var data = File.ReadLines("C:/your/file/path.txt")
               .Select(l => l.Split('='))
               .ToDictionary(k => k[0], v => v[1]);

编辑:正如Nico所指出的那样,当字典包含重复键时,字典将无效。但是,您仍然可以使用LINQ自动排列字典,以便源文本的ID字段是键而不是字段名称。例如,您可以使用以下内容:

var data = File.ReadLines("C:/your/file/path.txt")
               .Where(l => !String.IsNullOrEmpty(l))
               .Select((l, i) => new { ID = i / 4, Value = l.Split('=') })
               .GroupBy(x => x.ID)
               .Select(g => new { ID = g.First().Value[1].Trim(), Values = g.ToDictionary(k => k.Value[0].Trim(), v => v.Value[1].Trim()) })
               .ToDictionary(k => k.ID, v => v.Values);

之后,您可以遍历data来获取字段:

foreach (var d in data.Values)
{
    string id = d["ID"];
    string aesKey1 = d["AESKEY1"];
    string aesKey2 = d["AESKEY2"];
    string desKey1 = d["DESKEY1"];
}

答案 3 :(得分:0)

如果您想将数据放入如下字典:Dicationary<string, Dictionary<string,string>>
如果主词典的key是ID的值,而内部词典是后面的值,则以下内容将执行此操作:

string[] lines = input.Split('\n');
var myDict = new Dictionary<string, Dictionary<string,string>>();
var currentKey = "";

foreach (string[] keyVal in lines.Where(line=>!string.IsNullOrWhiteSpace(line))
                                 .Select(line => line.Split('='))) 
{
    if (keyVal[0].StartsWith("ID"))
    {
        currentKey = keyVal[1].Trim();
        myDict.Add(currentKey, new Dictionary<string, string>());
    }
    else
    {
        myDict[currentKey].Add(keyVal[0].Trim(), keyVal[1].Trim());
    }
}

答案 4 :(得分:-1)

正则表达式看起来像这样:

@"^ID\s+=\s+(.+)$"

您可以在Regex101Rextester

上对其进行测试