如何使用C#中的正则表达式匹配给定的模式?

如何使用C#中的正则表达式匹配给定的模式?,c#,.net,regex,C#,.net,Regex,我有以下意见: -key1:“val1”-key2:“val2”-key3:(val3)-key4:“(val4)”-key5:val5-key6:“val-6”-key-7:val7-key8:“val 8” 仅对模式进行以下假设: 键始终以-开头,后跟由分隔的值: 如何匹配和提取每个键及其对应的值 到目前为止,我提出了以下正则表达式: -(?\S*):\S?(?\S*) 但它当前与最后一个参数的完整值不匹配,因为它包含一个空格,但我不知道如何匹配它 预期产出应为: 键1“val1” 键

我有以下意见:

-key1:“val1”-key2:“val2”-key3:(val3)-key4:“(val4)”-key5:val5-key6:“val-6”-key-7:val7-key8:“val 8”

仅对模式进行以下假设:

  • 键始终以
    -
    开头,后跟由
    分隔的值:
如何匹配和提取每个键及其对应的值

到目前为止,我提出了以下正则表达式:

-(?\S*):\S?(?\S*)

但它当前与最后一个参数的完整值不匹配,因为它包含一个空格,但我不知道如何匹配它

预期产出应为:

  • 键1“val1”
  • 键2“val2”
  • 键3(val3)
  • 键4“(val4)”
  • 键5 val5
  • 键6“val-6”
  • 键7 val7
  • 键8 val 8

非常感谢您的帮助。

我想您希望保留括号和引号,因为您在给出的示例中就是这么做的?如果是这样的话,那么以下措施应该有效:

-(?<key>\S+):+\s?(?<val>\S+\s?\d+\)?\"?)
-(?\S+):+\S?(?\S++\S?\d++\)?\?)
这确实假定所有val的结尾都是一个数字

编辑: 假设val不总是以数字结尾,但我猜它总是以val开头,这就是我的:

-(?<key>\S+):+\s?(?<val>\"?\(?(val)+\s?\S+)
-(?\S+):+\S?(?\”?\(?(val)+\S?\S+)

似乎工作正常…

猜测只允许不在开头或结尾的空白字符,请将正则表达式更改为:

-(?<key>\S*):\s?(?<val>\S+(\s*[^-\s])*)
-(?\S*):\S?(?\S+(\S*[^-\S])*)
这假定前面有空格的字符
-
无疑意味着新键开始了,它不能是任何值的一部分

对于此示例:

-key:value-key2:value加空格-key3:value加连字符-key4:v

比赛内容如下:
-key:value
-key2:value带空格
-key3:value带连字符
-key4:v

它在您提供的示例中也非常有效。

一个低技术(非正则表达式)解决方案,只是作为替代方案。如果需要,请使用Trim guff,
to dictionary

var results = input.Split(new[] { " -" }, StringSplitOptions.RemoveEmptyEntries)
                   .Select(x => x.Trim('-').Split(':'));

输出

key1 -> "val1"
key2 ->  "val2"
key3 -> (val3)
key4 ->  "(val4)"
key5 ->  val5
key6 ->  "val-6"
key-7 ->  val7
key8 ->  "val 8"
尝试使用替换功能:

(?:^|(?!\S)\s*)-|\s*:\s*

并替换为“\n”。您应该在单独的行中获取键值。

这应该可以做到这一点

-(?<key>\S*):\s*(?<value>(?(?=")((")(?:(?=(\\?))\2.)*?\1))(\S*))
-(?\S*):\S*(?(?=)(((?:(?=))\2.*?\1)(\S*))
可以找到一个示例链接。
基本上是这样的,如果/else/then要检测值是否包含
作为
(?(?=”)(真正则表达式)(假正则表达式)
,假正则表达式是你的
\S*
,而真正则表达式将尝试匹配开始/结束引号
(”)((?=(\\?)\2.*?\1)

您是在单个字符串中传递所有键、值还是对其进行迭代?只需删除此正则表达式后的最后一个空格如何?没有大的处理您希望的输出/结果是什么?因此…空格是值的一部分还是键的一部分?…您能否按照Tim的建议给出一个输入和输出的示例?@popeye,是的,所有的键值都是单个的e行,它将与正则表达式匹配以提取每个keyval。您的第一个假设是正确的,但值不一定以数字结尾。啊,它们也不一定以括号或引号结尾。哈哈。这让它变得有点棘手。这几乎可以很好地工作,尽管它要求值以数字值结尾请再试一次,正如我上面提到的,您不能假设除了
键总是以a开头,后跟一个由以下分隔的值之外的任何东西:
Ahhh,你在这里杀了我哈哈;)这看起来很好,目前正在一个更大的数据集上进行更多的测试。很快会回来报告。看起来就像我看到的:)是的,按照预期完成了工作。非常感谢。