C#需要正则表达式以捕获下划线后的第二次出现

时间:2018-09-18 16:53:16

标签: c# regular-language

我正在使用下面的正则表达式来捕获下划线后的所有数字/字母,但是我只需要捕获第二次出现的情况,即“ 00500”,如下所示:

regular expresion: (?<=_)[a-zA-Z0-9]+

string:
"-rw-rw-rw- 1 rats rats 31K Sep 17 13:33 /opt/data/automation_sent/20180918/labc/0/20180918_00500.itx"

我正在用C#编写代码,我以为该值应该在第二组中[1],但不是。它仅捕获字符串“ _sent”:

        string temp2 = "";
        Regex getValueAfterUnderscore = new Regex(@"(?<=_)[a-zA-Z0-9]+");
        Match match2 = getValueAfterUnderscore.Match(line);
        if (match2.Success)
        {
            temp2 = match2.Groups[1].Value;
            Console.WriteLine(temp2); 
        }

有什么想法吗?谢谢!

4 个答案:

答案 0 :(得分:1)

也许您将“组”与“比赛”混淆了。您应该搜索正则表达式的匹配项。这是在给定的字符串中列出正则表达式的所有匹配项的方法:

string str = "-rw-rw-rw- 1 rats rats 31K Sep 17 13:33 /opt/data/automation_sent/20180918/labc/0/20180918_00500.itx";

MatchCollection matches = Regex.Matches(str, @"(?<=_)[a-zA-Z0-9]+");
foreach (Match curMatch in matches)
    Console.WriteLine(curMatch.Value);

对于您的特定情况,请验证是否至少有2个匹配项,并获取matches[1]的值(这是第二个匹配项)。

if (matches.Count >= 2)
    Console.WriteLine($"Your result: {matches[1].Value}");

答案 1 :(得分:1)

var input = "-rw-rw-rw- 1 rats rats 31K Sep 17 13:33 /opt/data/automation_sent/20180918/labc/0/20180918_00500.itx";
    Regex regex = new Regex(@"(?<Identifier1>\d+)_(?<Identifier2>\d+)");
    var results = regex.Matches(input);
    foreach (Match match in results)
    {
        Console.WriteLine(match.Groups["Identifier1"].Value);
        Console.WriteLine(match.Groups["Identifier2"].Value);//second occurence
    }

在这里进行了测试:http://rextester.com/SIMXNS63534

答案 2 :(得分:1)

您可以使用以下代码在第二个下划线后捕获文本

 var line = "-rw-rw-rw- 1 rats rats 31K Sep 17 13:33 /opt/data/automation_sent/20180918/labc/0/20180918_00500.itx";
            string temp2 = "";
            Regex getValueAfterUnderscore = new Regex(@"_.+_([a-zA-Z0-9]+)");
            Match match2 = getValueAfterUnderscore.Match(line);
            if (match2.Success)
            {
                temp2 = match2.Groups[1].Value;
                Console.WriteLine(temp2); 
            }

输出:

00500

答案 3 :(得分:0)

如果您所有的字符串都看起来像这种模式 { SOME_STRING} _ {YOUR_NUMBER} .itx ,则您可以使用此解决方案(不使用正则表达式)

var arr = str.Split(new[] {"_", ".itx"}, StringSplitOptions.RemoveEmptyEntries);
var result = arr[arr.Length - 1];