c# - 如何使用较长的分隔符优先于较短的分隔符来拆分字符串?

标签 c# string split

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

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() 方法中。

最佳答案

您可以尝试多种选择。如果你有一组分隔符,你可以在拆分之前按正确的顺序对它们进行排序:

  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

关于c# - 如何使用较长的分隔符优先于较短的分隔符来拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56527472/

相关文章:

java - Java中的字符串替换和输出

c# - 如何将包含十六进制对的字符串转换为字节?

excel - 在 Excel 单元格的最后一个 '.' 之后添加字符串

mysql - 如何对sql表列进行拆分

regex - Perl拆分奇怪的行为

c# - 在 C# 中无失真地裁剪和打印图像文档

c# - 散列范围

string - 将字符串转换为字符串

c# - IDisposable.Dispose 永远不会在使用 block 异常后被调用

c# - 混淆或保护 .Net 程序集的最佳方法