特定列表的正则表达式

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 开始,后跟任何空格字符,以确保您不会捕获test2test3。然后捕获所有剩余的字符以获取剩余的行。

(?<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

【讨论】:

以上是关于特定列表的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

C#中特定html标签的正则表达式[重复]

正则表达式从字符串中提取特定文本[重复]

如何用元组列表替换列表中正则表达式匹配的模式?

正则表达式根据其中的值获取特定匹配括号后的所有内容

[使用正则表达式从python文本中提取特定单词

正则表达式排除特定字符串