-1

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

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

4

4 回答 4

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;
}
于 2013-07-09T08:01:08.490 回答
0

您不必使用正则表达式来完成此操作。只需将运算符存储在数组中。保持数组按运算符的长度排序。遍历操作符并使用 获取操作符的位置IndexOf()。现在您可以使用Substring()从输入字符串中提取键和值。

于 2013-07-09T08:04:09.487 回答
0

正则表达式具有“或”运算符(分隔符将包含在结果中):

Regex.Split(@sourceString, @"(>=)|(<=)|(!=)|(=)|(>)|(<)");
于 2013-07-09T08:00:45.833 回答
0

您可以只使用分支来提供多种选择。实现这一目标有多种可能性,一个例子是:

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

如您所见,此表达式包含三个单独的捕获组:

  • (\w+?):这将匹配“单词”字符(字母数字和下划线),只要序列至少有一个字符长(+)。
  • ([!<>]?=|[<>]):此表达式与您的示例中给出的运算符匹配。前半部分 ( [!<>]?=) 将匹配其中的任何字符[](或跳过它 ( ?)),后跟=. 替代方案只是匹配<or >
  • (.*):这将匹配任何字符(或什么都不匹配),直到字符串/行的末尾。

因此,当您匹配表达式时,您将获得总共 4 个(子)匹配项:

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

编辑: 如果您还想匹配其他运算符,则必须将它们添加为第二个匹配组中的附加分支:

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

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

于 2013-07-09T08:04:25.580 回答