[英]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"
关于模式只有以下假设:
-
后跟由以下分隔的值:
如何匹配和提取每个键及其相应的值 ?
到目前为止我已经提出了以下正则表达式 :
-(?<key>\\S*):\\s?(?<val>\\S*)
但它目前不匹配最后一个参数的完整值,因为它包含一个空格,但我无法弄清楚如何匹配它。
预期产量应为:
任何帮助深表感谢。
猜测您只想允许不在开头或结尾的空格字符,请将正则表达式更改为:
-(?<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"
这应该可以解决问题
-(?<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.