我有一个string
,我想一分为二。通常它是一个名称,运算符和一个值。我想将其分为名称和价值。名称可以是任何值,也可以是值。我所拥有的是一组运算符,我的想法是将其用作分隔符:
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()
方法中会发生这种行为。
答案 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