繁体   English   中英

如何在C#中使用Regex匹配给定的模式?

[英]How can I match the given pattern using Regex in C#?

我有以下输入:

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

关于模式只有以下假设:

  • 键始终以a开头-后跟由以下分隔的值:

如何匹配和提取每个及其相应的

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

-(?<key>\\S*):\\s?(?<val>\\S*)

但它目前不匹配最后一个参数的完整值,因为它包含一个空格,但我无法弄清楚如何匹配它。

预期产量应为:

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

任何帮助深表感谢。

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

-(?<key>\S*):\s?(?<val>\S+(\s*[^-\s])*)

这假定字符-前面有空格毫无疑问意味着新键开始,它不能是任何值的一部分。

对于这个例子:

-key: value -key2: value with whitespace -key3: value-with-hyphens -key4: v

匹配为: -key2: value with whitespace -key: value-key2: value with whitespace-key3: value-with-hyphens-key4: v

它也适用于您提供的示例。

我认为你想要保留括号和引号,就像你在你给出的例子中所做的一样? 如果是这样,则以下内容应该有效:

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

这确实假设所有的val都以数字结尾。

编辑:鉴于val并不总是以数字结尾,但我猜它总是以val开头,这就是我所拥有的:

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

似乎工作正常......

低技术(非正则表达式)解决方案,仅供替代方案使用。 如果你需要,修剪guff, ToDictionary

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*))

可在此处找到示例链接。 基本上它确实和if / else /然后检测值是否包含" as (?(?=")(true regex)(false regex) ,假正则表达式是你的\\S*而真正的正则表达式将尝试匹配start / end quote (")(?:(?=(\\\\?))\\2.)*?\\1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM