我有一个如下所示的字符串:
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/