我有一个 string
,我想将其一分为二。通常它是一个名称、运算符和一个值。我想把它分成名称和值(value)。名称可以是任何东西,值也可以。我所拥有的是一组运算符,我的想法是将其用作分隔符:
var input = "name>=2";
var separators = new string[]
{
">",
">=",
};
var result = input.Split(separators, StringSplitOptions.RemoveEmptyEntries);
上面的代码给出的结果是 name
和 =2
。但是,如果我重新排列分隔符的顺序,那么 >=
将排在第一位,如下所示:
var separators = new string[]
{
">=",
">",
};
这样,我得到了很好的 name
和 2
,这是我想要实现的。可悲的是,让分隔符保持完美的顺序对我来说是行不通的。另外,我收集的分隔符不是一成不变的。所以,我在想也许我可以将 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/