首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中使用Regex匹配给定的模式?

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

Stack Overflow用户
提问于 2018-08-08 11:10:24
回答 5查看 82关注 0票数 2

我有以下意见:

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

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

预期产出应是:

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

任何帮助都是非常感谢的。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-08-08 11:24:57

如果您想只允许不位于开头或结尾的空格字符,请将regex更改为:

代码语言:javascript
复制
-(?<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

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

票数 4
EN

Stack Overflow用户

发布于 2018-08-08 11:24:45

我想你是想保留括号和引号,因为这就是你在给出的例子中所做的?如果是这样的话,那么以下几点就可以了:

代码语言:javascript
复制
-(?<key>\S+):+\s?(?<val>\S+\s?\d+\)?\"?)

但这确实假定所有瓦尔的结尾都有一个数字。

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

代码语言:javascript
复制
-(?<key>\S+):+\s?(?<val>\"?\(?(val)+\s?\S+)

似乎运转正常..。

票数 1
EN

Stack Overflow用户

发布于 2018-08-08 11:31:44

一个低科技(非regex)解决方案,只是作为一个替代方案。如果你需要的话,修剪一下ToDictionary

代码语言:javascript
复制
var results = input.Split(new[] { " -" }, StringSplitOptions.RemoveEmptyEntries)
                   .Select(x => x.Trim('-').Split(':'));

全演示

输出

代码语言:javascript
复制
key1 -> "val1"
key2 ->  "val2"
key3 -> (val3)
key4 ->  "(val4)"
key5 ->  val5
key6 ->  "val-6"
key-7 ->  val7
key8 ->  "val 8"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51745214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档