特定列表的正则表达式
Posted
技术标签:
【中文标题】特定列表的正则表达式【英文标题】:Regex for specific list 【发布时间】:2016-03-15 11:18:19 【问题描述】:我需要用逗号分隔的数字从每一行中提取(C#)
test 35,1 35,2 35,3 35,4 35,5
test2 35,1 35,2 35,3 35,4 35,5
test3 35,1 35,2 35,3 35,4 35,5
test 35,1 35,2 35,3 35,4 35,5
test2 35,1 35,2 35,3 35,4 35,5
test3 35,1 35,2 35,3 35,4 35,5
我想要一个有两个匹配项的组名测试
test 35,1 35,2 35,3 35,4 35,5
test 35,1 35,2 35,3 35,4 35,5
到目前为止我所取得的成就:
(?>test(?>(?<test>[\w\s,]+)\n))
,但所有文本都被选中到最后一行
谢谢
【问题讨论】:
类似this? 救命稻草谢谢你能不能帮我用相同格式的所有组 test2 和 test3 制作相同的正则表达式,以便我可以捕获所有匹配项 您可以在test
之后添加\d*
:(?>test\d*\b(?>\s*(?<test>\d+(?:,\d+)*))+)
- 这些数字将全部在第 2 组捕获集合中。
这行得通,如果名称与那些不同?抱歉所有问题,但正则表达式对我来说是新的
对不起另一个问题,但你给我看的正则表达式只选择了最后一个数字 35,5。我需要这样的所有数字的完整行:test2 35,1 35,2 35,3 35,4 35,5。你能帮帮我吗?
【参考方案1】:
您可以这样命名您的捕获组:(?<name>expression)
。其余部分的编写相当简单。从文字字符串test
开始,后跟任何空格字符,以确保您不会捕获test2
或test3
。然后捕获所有剩余的字符以获取剩余的行。
(?<test>test\s.*)
然后您可以像这样访问您的命名组:
var matches = Regex.Matches(input, @"(?<test>test\s.*)");
foreach(Match match in matches)
string result = match.Groups["test"].Value;
【讨论】:
【参考方案2】:这是您可以利用的正则表达式:
(?<key>test\d*)\b(?>\s*(?<test>\d+(?:,\d+)*))+
查看regex demo here,key
命名组将保存test
+digit(s) 值,test
组将保存CaptureCollection
(match.Groups["test"].Captures
) 中键之后的所有数字):
这是一个 IDEONE 演示,展示了如何在 C# 中检索这些值:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
public class Test
public static void Main()
var strs = new List<string> "test 35,1 35,2 35,3 35,4 35,5",
"test2 35,1 35,2 35,3 35,4 35,5",
"test3 35,1 35,2 35,3 35,4 35,5",
"test 35,1 35,2 35,3 35,4 35,5",
"test2 35,1 35,2 35,3 35,4 35,5",
"test3 35,1 35,2 35,3 35,4 35,5";
var pattern = @"(?<key>test\d*)\b(?>\s*(?<test>\d+(?:,\d+)*))+";
foreach (var s in strs)
var match = Regex.Match(s, pattern, RegexOptions.ExplicitCapture);
if (match.Success)
// DEMO
var key = match.Groups["key"].Value;
var tests = match.Groups["test"].Captures.Cast<Capture>().Select(m => m.Value).ToList();
Console.WriteLine(key);
Console.WriteLine(string.Join(", and ", tests));
输出:
test
35,1, and 35,2, and 35,3, and 35,4, and 35,5
test2
35,1, and 35,2, and 35,3, and 35,4, and 35,5
test3
35,1, and 35,2, and 35,3, and 35,4, and 35,5
test
35,1, and 35,2, and 35,3, and 35,4, and 35,5
test2
35,1, and 35,2, and 35,3, and 35,4, and 35,5
test3
35,1, and 35,2, and 35,3, and 35,4, and 35,5
【讨论】:
以上是关于特定列表的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章