我有以下意见:
-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*)
但它目前并不匹配最后一个参数的完整值,因为它包含一个空格,但我不知道如何匹配它。
预期产出应是:
任何帮助都是非常感谢的。
发布于 2018-08-08 11:24:57
如果您想只允许不位于开头或结尾的空格字符,请将regex更改为:
-(?<key>\S*):\s?(?<val>\S+(\s*[^-\s])*)这假定字符-前面有空格,这无疑意味着一个新的键开始了,它不能是任何值的一部分。
对于这个例子:
-key: value -key2: value with whitespace -key3: value-with-hyphens -key4: v
比赛是:-key: value,-key2: value with whitespace,-key3: value-with-hyphens,-key4: v。
在您提供的示例中,它也非常有效。
发布于 2018-08-08 11:24:45
我想你是想保留括号和引号,因为这就是你在给出的例子中所做的?如果是这样的话,那么以下几点就可以了:
-(?<key>\S+):+\s?(?<val>\S+\s?\d+\)?\"?)但这确实假定所有瓦尔的结尾都有一个数字。
编辑:,考虑到val并不总是以数字结尾,但我猜想它总是以val开头,这就是我所拥有的:
-(?<key>\S+):+\s?(?<val>\"?\(?(val)+\s?\S+)似乎运转正常..。
发布于 2018-08-08 11:31:44
一个低科技(非regex)解决方案,只是作为一个替代方案。如果你需要的话,修剪一下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"https://stackoverflow.com/questions/51745214
复制相似问题