在c#中拆分字符串并访问特定索引处的数据

Splitting a string in c# and accessing data at a certain index

所以我有一个这样的字符串...

"Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45" 

有没有办法拆分字符串,以便我可以访问数字“103”(供参考,具体取决于用户 activity)。我只对所述数字感兴趣,并且一直在尝试尝试使用 split 函数和数组,但运气不好 :(

从该行我确定了以下模式:
每行有多个字段,由 --
分隔 每个字段都是一个名称值对,其中名称与值由 :

分隔

所以:

string[] fieldSeparators = new string[] { "--" };
string[] nameValueSeparators = new string[] {":"};
var fieldsArray = row.Split(fieldSeparators, StringSplitOptions.RemoveEmptyEntries);
Dictionary fields = new Dictionary<string,string>();
foreach (var field in fieldsArray)
{
  var tokens = field.Split(nameValueSeparators, StringSplitOptions.None);
  if (tokens.Length >= 2)
     fields[tokens[0]/*.Trim()*/] = tokens[1]/*.Trim()*/;
}

你想要的值(作为字符串)可以从字典中获得:

fields["Opp#"]

这比你说的要多,但看起来结构化的数据应该结构化。

尝试拆分 -- 并从列表中取出 First() 元素。在该元素上在 : 处进行拆分并取第二个元素 ([1]).

string data = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
var elements = data.Split(new []{"--"}, StringSplitOptions.None);
var opp = Int32.Parse(elements.First().Split(':')[1].Trim());

如@steve 所言,如果您确定后面始终跟有一个数字,您只能在 ' ' 进行 1 次拆分。

var opp = Int32.Parse(data.Split(' ')[1]);

您还可以创建一个模型来匹配该类型的数据。并创建一个函数将 string 反序列化为 model。通过这种方式,您可以在需要时访问任何 属性。 示例:

string data = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
var model = new ModelDeserialize("--"," ", 1).Deserialize(data);

这将使 Model

中的那种类型的字符串反序列化
public class ModelDeserialize
{
    private string _elementsSeparator;
    private string _dataSeparator;
    private int _valueIdx;

    public ModelDeserialize(string elementsSeparator, string dataSeparator, int valueIdx)
    {
        _elementsSeparator = elementsSeparator;
        _dataSeparator = dataSeparator;
        _valueIdx = valueIdx;
    }

    public Model Deserialize(string data)
    {
        var idx = 0;
        var separatedElements = data.Split(new[] { _elementsSeparator }, StringSplitOptions.RemoveEmptyEntries);
        var model = new Model();
        model.Opp = Int32.Parse(Value(separatedElements[idx++]));
        model.Member = Value(separatedElements[idx++]);
        model.Patient = Value(separatedElements[idx++]);
        model.Room = Value(separatedElements[idx++]);
        model.Time = Value(separatedElements[idx]);
        return model;
    }

    private string Value(string element)
    {
        return element.Split(new[] { _dataSeparator }, StringSplitOptions.None)[_valueIdx].Trim();
    }
}

Model,可以有一个更有意义的名字。

public class Model
{
    public int Opp { get; set; }
    public string Member { get; set; }
    public string Patient { get; set; }
    public string Room { get; set; }
    public string Time { get; set; }
}
string content = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";
string result = content.Split('-')[0].Split(':')[1].Trim();

您可以使用正则表达式来获取值

using System.Text.RegularExpressions;

Regex oppNumber = new Regex(@"^Opp#: (<?number>\d)+",RegexOptions.Compiled);

public int ParseValue(string line)
{
    return Int32.Parse(oppNumber.Match(line).Groups["number"].Value);
}

此示例中没有错误检查,因此您需要添加额外的代码来处理格式错误的数据。

你可以试试正则表达式:

    string s = "Opp#: 103 -- Member: mem1-- Patient: patient1-- Room: n.10 -- Time: 16:45";

    Regex rex = new Regex(@"Opp#: (\d+) -- Member: ([^-]+)-- Patient: ([^-]+)-- Room: ([^-]+)-- Time: (.....)");

    var match = rex.Match(s);

    Console.WriteLine(match.Groups[1]);  //103
    Console.WriteLine(match.Groups[2]);  //mem1
    Console.WriteLine(match.Groups[3]);  //patient1
    Console.WriteLine(match.Groups[4]);  //n.10
    Console.WriteLine(match.Groups[5]);  //16:45