我有一个"KeyOperatorValue1,Value2,Value2...."
类型的字符串。例如,对于例如"version>=5"
,"lang=en,fr,es"
等,当前,运算符字段的可能值为"=", "!=", ">", ">=", "<", "<="
,但我不希望它仅限于它们。现在问题是这样一个字符串,我怎么能分成三元组?
因为,所有运算符的字符串表示都不是互斥的("="
是">="
的一个子集),我不能使用public string[] Split(string[] separator, StringSplitOptions options)
而Regex.Split
没有' t有一个变量,它将多个正则表达式作为参数。
答案 0 :(得分:2)
由于您没有提及输入的格式,我已做出某些假设。
我假设
键值对将由非单词字符分隔
(?<key>\w+)(?<operand>[^\w,]+)(?<value>[\w,]+)
因此,如果字符串不是,
或[a-zA-Z\d_]
您可以使用此代码
var lst=Regex.Matches(input,regex)
.Cast<Match>()
.Select(x=>new{
key=x.Groups["key"].Value,
operand=x.Groups["operand"].Value,
value=x.Groups["value"].Value
});
您现在可以迭代lst
foreach(var l in lst)
{
l.key;
l.operand;
l.value;
}
答案 1 :(得分:0)
正则表达式有“或”运算符(虽然分隔符将包含在结果中):
Regex.Split(@sourceString, @"(>=)|(<=)|(!=)|(=)|(>)|(<)");
答案 2 :(得分:0)
您不必使用正则表达式来实现这一目标。只需将运算符存储在数组中即可。保持数组按运算符的长度排序。迭代运算符并使用IndexOf()
获取运算符的位置。现在,您可以使用Substring()
从输入字符串中提取键和值。
答案 3 :(得分:0)
您可以使用分支来提供多种替代方案。实现这一目标有多种可能性,例如:
(\w+)([!<>]?=|[<>])(.*)
如您所见,此表达式包含三个单独的捕获组:
(\w+?)
:这将匹配“单词”字符(字母数字和下划线),只要序列至少有一个字符长(+
)。([!<>]?=|[<>])
:此表达式与示例中给出的运算符匹配。上半部分([!<>]?=
)将匹配[]
内的任何字符(或跳过它(?
)),后跟=
。替代方案只匹配<
或>
。(.*)
:这将匹配任何字符(或任何字符),无论如何直到字符串/行的结尾。因此,当您匹配表达式时,您将获得总共4(子)匹配:
修改强> 如果您还想匹配其他运营商,则必须在第二个匹配组中将其添加为其他分支:
(\w+)([!<>]?=|[<>]|HERE)(.*)
请记住,在没有定义应被视为有效操作数(或操作数组件)的确切字符的情况下,通常没有100%完美匹配任何运算符的方法。