基于C#中多个分隔符的Regex Split

时间:2013-07-09 07:52:16

标签: c# regex

我有一个"KeyOperatorValue1,Value2,Value2...."类型的字符串。例如,对于例如"version>=5""lang=en,fr,es"等,当前,运算符字段的可能值为"=", "!=", ">", ">=", "<", "<=",但我不希望它仅限于它们。现在问题是这样一个字符串,我怎么能分成三元组?

因为,所有运算符的字符串表示都不是互斥的("="">="的一个子集),我不能使用public string[] Split(string[] separator, StringSplitOptions options)Regex.Split没有' t有一个变量,它将多个正则表达式作为参数。

4 个答案:

答案 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(子)匹配:

  • 1:密钥的名称。
  • 2:运营商使用。
  • 3:给出的实际值。

修改 如果您还想匹配其他运营商,则必须在第二个匹配组中将其添加为其他分支:

(\w+)([!<>]?=|[<>]|HERE)(.*)

请记住,在没有定义应被视为有效操作数(或操作数组件)的确切字符的情况下,通常没有100%完美匹配任何运算符的方法。