Regex在单行中匹配多个字段值

  • 本文关键字:字段 单行中 Regex c# regex
  • 更新时间 :
  • 英文 :


我希望在单行中匹配由冒号分隔的多字段值,但每个字段和值文本都包含空格例如

field1   :    value1a  value1b
answer
match1: Group1=field1, Group2=value1a value1b

field1   :    value1a  value1b   field2   : value2a value2b
answer
match1: Group1=field1, Group2=value1a value1b
match2: Group1=field2, Group2=value2a value2b

我现在能做的最好的是(\w+(\s*:\s*(\w+

Regex regex = new Regex(@"(w+)s*:s*(w+)");
Match m = regex.Match("field1   :    value1a  value1b   field2   : value2a value2b");
while (m.Success)
{
string f = m.Groups[1].Value.Trim();
string v = m.Group2[2].Value.Trim();
}

我想向前看可能会有所帮助,但我不知道该怎么做谢谢

您可以尝试

(w+)s*:s*((?:(?!s*w+s*:).)*)
  • (w+)组1,任何连续单词
  • s*:s*周围有任意空格的冒号
  • (...)组2
  • (?:...)*是一个非捕获组,重复任何时间
  • (?!s*w+s*:).前面有一个字符的负向前看,后面的字符不能形成后面有冒号的任何空格的单词。因此,组2从不消耗冒号之前的任何单词

查看测试用例

您可以使用基于懒惰点的正则表达式:

var matches = Regex.Matches(text, @"(w+)s*:s*(.*?)(?=s*w+s*:|$)");

请在线查看C#演示和.NET regex演示(请注意,regex101.com不支持.NET regex风格(。

正如你所看到的,没有必要使用脾气暴躁的贪婪代币。正则表达式的意思是:

  • (w+)-组1:任意一个或多个字母/数字/下划线
  • s*:s*-用零个或多个空白字符括起来的冒号
  • (.*?)-第2组:除了换行符之外的任何零个或多个字符,尽可能少
  • (?=s*w+s*:|$)-直到第一次出现一个或多个单词字符时,该字符由零个或更多个whitesapces或字符串结尾括起来

完整的C#演示:

using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var text = "field1   :    value1a  value1b   field2   : value2a value2b";
var matches = Regex.Matches(text, @"(w+)s*:s*(.*?)(?=s*w+s*:|$)");
foreach (Match m in matches)
{
Console.WriteLine("-- MATCH FOUND --nKey: {0}, Value: {1}", 
m.Groups[1].Value, m.Groups[2].Value);
}
}
}

输出:

-- MATCH FOUND --
Key: field1, Value: value1a  value1b
-- MATCH FOUND --
Key: field2, Value: value2a value2b

最新更新