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