如何使用较长的分隔符而不是较短的分隔符来分割字符串?

时间:2019-06-10 13:33:34

标签: c# string split

我有一个string,我想一分为二。通常它是一个名称,运算符和一个值。我想将其分为名称和价值。名称可以是任何值,也可以是值。我所拥有的是一组运算符,我的想法是将其用作分隔符:

var input = "name>=2";
var separators = new string[]
{
    ">",
    ">=",
};
var result = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);

上面的代码给出结果为name=2。但是,如果我重新排列分隔符的顺序,那么>=将是第一个,就像这样:

var separators = new string[]
{
    ">=",
    ">",
};

这样,我就可以很好地实现name2了。可悲的是,使分隔符保持完美的顺序对我来说是行不通的。另外,我的分隔符集合不是一成不变的。因此,我在想也许可以将string与较长的分隔符分开,优先于较短的分隔符?

感谢帮助!

Here是一个相关的问题,解释了为什么在Split()方法中会发生这种行为。

2 个答案:

答案 0 :(得分:2)

您可以尝试对正则表达式进行正则表达式拆分,该替代首先列出较长的>=

var input = "name>=2";
string[] parts = Regex.Split(input, "(?:>=|>)");
foreach(var item in res)
{
    Console.WriteLine(item.ToString());
}

此打印:

name
2

请注意,如果我们在(?:>|>=)上进行拆分,则输出将分别为name=2

答案 1 :(得分:2)

您可以尝试几种选择。如果您有分隔符的集合,则可以在分割之前按正确的顺序对其进行排序:

  using System.Linq;

  ...

  var result = input.Split(
    separators.OrderByDescending(item => item.Length), // longest first
    StringSplitOptions.RemoveEmptyEntries);

您可以尝试将所有(包括可能的)分隔符组织到单个模式中,例如

 [><=]+

在这里,我们按照><=

最长序列进行划分
 var result = Regex.Split(input, "[><=]+");

演示:

  using System.Text.RegularExpressions;

  ...

  string[] tests = new string[] {
    "name>123",
    "name<4",
    "name=78",
    "name==other",
    "name===other",
    "name<>78",
    "name<<=4",
    "name=>name + 455",
    "name>=456",
    "a_b_c=d_e_f",
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => string.Join("; ", Regex.Split(test, "[><=]+"))));

  Console.Write(report);

结果:

name; 123
name; 4
name; 78
name; other
name; other
name; 78
name; 4
name; name + 455
name; 456
a_b_c; d_e_f