c# - 字符串中的子字符串值

标签 c# regex string linq

我有一个字符串变量,其中包含 [l=9;f=0;r=5;p=2] 。可能有不止一个:[l=9;f=0;r=5;p=2],[l=9;f=0;r=6;p=2] .

我想要ListTuple<int,int,int> ,其中item1 = value of l, item2= value of r, item3=value of p 。做到这一点的最佳方法是什么?
我的代码:

  // split string
    var splittedFormatedSeats = Regex.Matches(formatSeats, @"\[.+?\]")
                            .Cast<Match>()
                            .Select(m => m.Value)
                            .ToList();


     IList<Tuple<int,int,int>> fullSeat = new List<Tuple<int, int, int>>();
       foreach (var splittedFormatedSeat in splittedFormatedSeats)
       {

          ...
       }

谢谢。

最佳答案

我会采取另一种策略。首先,拆分字符串的子组件

var components = formatSeats.Split(',');

这将为您提供一个字符串数组。这对于解析小字符串而不是大字符串会更有效。

然后,您可以使用 Regex 来提取值或使用如下简单代码:

foreach(var component in components)
{
    var parts = component.Trim("[]".ToCharArray()).Split(';');

}

var results = from component in components
              let c = component.Trim("[]".ToCharArray())
                               .Split(';')
                               .Select(c=>int.Parse(c.SubString(2))
              select new { l = c[0], f=c[1], r=c[2], p = c[3] };

这将生成匿名类型的枚举。

foreach(var x in results)
{
    Console.WriteLine("{0} / {1} / {2} / {3}", x.l, x.f, x.r, x.p);
}

如果您确实需要一个Tuple,只需将代码更改为:

var results = from component in components
              let c = component.Trim("[]".ToCharArray())
                               .Split(';')
                               .Select(c=>int.Parse(c.SubString(2))
              select new Tuple<int,int,int,int>{ l = c[0], f=c[1], r=c[2], p = c[3] };

但是,我会提倡编写一个小结构来简化代码并提高其可读性。

public struct MyValue
{
     private readonly int m_L; 
     public int L { get {return m_L; } }

     private readonly int m_F; 
     public int F { get {return m_F; } }

     private readonly int m_R; 
     public int R { get {return m_R; } }

     private readonly int m_P; 
     public int P { get {return m_P; } }

     public MyValue(int l, int f, int r, int p)
     {
         m_L = l;
         m_F = f;
         m_R = r;
         m_P = p;
     }
}
....


var results = from component in components
          let c = component.Trim("[]".ToCharArray())
                           .Split(';')
                           .Select(c=>int.Parse(c.SubString(2))
          select new MyValue(c[0],c[1],c[2],c[3]);

最后,如果字符串始终具有这种形式,您可以避免使用正则表达式。

关于c# - 字符串中的子字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12296854/

相关文章:

c# - Winforms ListView C# 中的 collection.Insert(0, newItem) 与 list.Add(newItem) + Sort 更快吗?

c# - Xamarin 中的 Java.Lang.NullPointerException

PHP preg_replace() 反向引用用作另一个函数的参数

string - 如何用更少的内存保存多个相似(分层格式)的字符串?

c - 用指针在 C 中包装字符串

c# - 为什么对 CPU 绑定(bind)任务使用 C# async/await

c# - 正则表达式 - 在字符之前匹配模式

c++ - MFC中如何验证email id?

javascript - 限制最多一次使用任何字符 在 Javascript 中使用正则表达式

c - c中的malloc字符串与原始字符串的大小相同