【问题标题】:How can I separate string array via REGEX?如何通过 REGEX 分隔字符串数组?
【发布时间】:2010-08-10 11:35:38
【问题描述】:

我根据“-”分隔“A320-789-890”,我得到以下列表:

"A101C", "B7CL", "E7CL", "D7CL"

一切正常。我上面的结果集是我的解决方案结果。但我有两个问题:

  1. 如何使用正则表达式做到这一点?
  2. 如果我可以使用正则表达式来做到这一点,我可以将正则表达式与 linq 一起使用吗?
  3. 根据我下面的方法或正则表达式的性能,哪个更有效?

    命名空间 engRegex1 { 公共部分类Form1:表格 { 公共表格1() { 初始化组件(); }

        private void Form1_Load(object sender, EventArgs e)
        {
            Engineering eng = new Engineering();
            string[] engSplitList = new string[eng.engList.Count()];
            List<string> firstitem = new List<string>();
            foreach (string item in eng.engList)
            {
                engSplitList = item.Split('-');
                firstitem.Add(engSplitList[0]);
            }
            foreach (string item in firstitem)
                listBox1.Items.Add(item);
        }
    }
    public class Engineering
    {
        public List<string> engList = new List<string>() { 
            "A101C-234-456", "B7CL-567-789", "E7CL-567-789", "D7CL-567-789" };
    }
    

    }

【问题讨论】:

  • 如果split 有效,请继续使用它。为什么要把事情复杂化?
  • 重读 - 我不明白你怎么可能从 "A320-789-890" 得到 "A101C", "B7CL", "E7CL", "D7CL"
  • @Oded,如果你看一下这段代码,你可以看到他从哪里得到的。
  • @Tony - 看问题的第一句话...
  • @Oded, :P 我知道你在看哪里。我只是说你可以看到他的代码是什么意思。

标签: c# .net regex visual-studio


【解决方案1】:
  1. 您可以使用带有两个字符串的静态RegEx.Split 方法:

    string[] parts = RegEx.Split("A320-789-890", "-");

  2. 可以使用 Linq。您还可以将 Linq 与 string.Split 的结果一起使用——这两件事并没有真正的联系。你想用 Linq 做什么?

  3. 您需要根据自己的情况进行测试。我建议你用有代表性的数据做一个微基准测试。

我要补充一点,string.Split 简单且经过优化。如果它有效,您应该只使用它而不是寻找其他解决方案。修复它如果它成为瓶颈和问题 - 如果您分析您的应用程序,您可能会发现问题在其他地方。

【讨论】:

  • 这不是解决问题发布者提出的问题的好方法,特别是它没有按要求提高性能。 IndexOf+Substring 答案更接近正确答案。
  • @Timwi - 如果您阅读了这个问题,它是关于: 1. 可以使用 RegEx 吗? 2. 可以和linq一起使用吗? 3.哪个更高效 - 他的方式或RegEx。他绝不会要求性能最好的代码。
  • @Oded:通常我不会回复这个,但是...... WTF?你问为什么你的答案被否决了。我不能代表其他人,但我解释了为什么 否决了它。吵架有什么意义?
  • @Timwi:我可以理解 Oded 的观点。他回答了这些问题(尽管我怀疑 Q3 可能确实有一个明确的答案,而不是去测试)并因此而被否决。他的回答在我看来并没有错...只是想我会对此发表公正的看法...
  • 有了足够复杂的正则表达式,给出的答案变得更加高效和可读。不是给出示例的最佳解决方案,但对某人学习有好处,只要他们也了解为什么这不是这里的最佳案例。
【解决方案2】:

只要你只需要提取第一部分,我建议IndexOf + Subsstring

foreach (string item in eng.engList)
{
    listBox1.Items.Add(item.Subsstring(0, item.IndexOf('-'));
}

这将是最快(也可能是最简单)的方法。

//编辑
使用 LINQ 会是这样的:

listBox1.Items.AddRange(from item in eng.engList select item.Subsstring(0, item.IndexOf('-')));

使用正则表达式

foreach (string item in eng.engList)
{
    listBox1.Items.Add(RegEx.Match(item, "[^-]*").ToString());
}

使用 RegEX 和 LINQ:

listBox1.Items.AddRange(from item in eng.engList select RegEx.Match(item, "[^-]*").ToString())

【讨论】:

    【解决方案3】:

    你也可以只使用 Linq 和 split 来做你想做的事......

      var result = from s in engList
                   let first =  s.Split('-').First()
                   select first;
    

    【讨论】:

      【解决方案4】:

      这是一种比较老套的方法,请改用 AddRange,同时将列表绑定到列表框,这样您可以获得更好的性能和更紧凑的代码。

      从你的专业水平来看,正则表达式对你来说是一个不好的解决方法,正则表达式很难而且容易出错,拿一本关于正则表达式的书然后使用。

      请记住,紧凑表示法是对可读性的折衷

      问候

      【讨论】:

      • 这既粗鲁又不提供信息。没有关于如何使用 AddRange(甚至在哪里)或如何进行列表框绑定的帮助。总而言之,如果不分享会更好的答案。
      • Oded 我很欣赏坦率,谢谢,也许我用错了词,英语作为一种语言有时有点苛刻(不是我的第一语言)但是我觉得所有这些积极的强化比好的。自我挫伤会塑造性格,我厌倦了糟糕的代码和问题,阅读文档可以回答这些问题。我从我尊敬的人那里听说这是个好地方,所以我决定试一试,但无济于事。这个网站讨厌我,它认为我是一个脚本并不停地给我提供验证码,所以直到我变成一个胖赛龙,au revoir。 :)
      • 克里斯关于有用性,我同意这不是那么有用,但是已经发布了代码的帖子,(我不这样做)所以我就如何做到这一点给出了替代方案的提示, vages 我同意,但我没有那么多时间,我认为其他人会在此基础上再接再厉(他们做到了)。我认为没有人需要数据绑定方面的帮助,对此感到抱歉。我个人不同意将代码提供给人们的政策,因为这只会完成复制/粘贴(他们根本不会学习),并且对于必须在投入生产之前审查代码的人来说是一场噩梦。问候
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      相关资源
      最近更新 更多