c# - 使用正则表达式从单行字符串中提取重复模式

标签 c# regex

我有一个如下所示的字符串:

attr one = 1 attr two = 2

我想提取每个 attr x = y (其中 x 和 y 可以是任何包括空格,而不仅仅是数字,例如:attr name = Jonah)。

我尝试了以下模式:Regex pattern = new Regex(@"attr\s+(?<name>.*)\s+=\s+(?<value>.*)")但它会在一次匹配中返回整个字符串,并且不会分隔它们。

我怎样才能实现这一目标?

最佳答案

您可以使用

\battr\s+(?<name>\S*)\s+=\s+(?<value>.*?)(?=\s+attr\s|\z)

请参阅regex demo

详细信息

  • \battr - 一个字attr
  • \s+ - 1 个以上空格
  • (?<name>\S*) - 组“名称”:0 个或多个非空白字符
  • \s+=\s+ - 一个=包含 1 个以上空格的字符
  • (?<value>.*?) - 组“值”:除了换行符之外的任何 0 个或多个字符,尽可能少...
  • (?=\s+attr\s|\z) - 紧随其后的是 1+ 个空格,attr和一个空格,或字符串结尾。

查看C# demo (假设 names 都是唯一的):

var text = "attr one = one two three attr two = 3";
var dct = Regex.Matches(text, @"\battr\s+(?<name>\S*)\s+=\s+(?<value>.*?)(?=\s+attr\s|\z)")
        .Cast<Match>()
        .ToDictionary(p => p.Groups["name"].Value, p => p.Groups["value"].Value); 
foreach (var kvp in dct)
    Console.WriteLine("{0} -> {1}", kvp.Key, kvp.Value);

输出:

one -> one two three
two -> 3

关于c# - 使用正则表达式从单行字符串中提取重复模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63314056/

相关文章:

regex - preg_match() : No ending delimiter '/' found

Java:正则表达式解析字符串的 "edges"

c# - 通过 Hotmail 发送电子邮件到 gmail

c# - 需要一种方法来获取构建给定表达式树的代码

c# - 字符串操作,如何轻松提取一个 HTML 元素值?

c# - 加密/混淆文件名

php - 获取选定列的正则表达式

Javascript 替换未转义的斜杠

java - Android:接受正则表达式中的所有特殊字符

c# - 在 List<String> 中查找逗号分隔的字符串