C # нужно регулярное выражение, чтобы захватить второй случай после подчеркивания - PullRequest
0 голосов
/ 18 сентября 2018

Я использую приведенное ниже регулярное выражение для захвата всех цифр / букв после подчеркивания, но мне нужно захватить только второе вхождение, то есть "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 голосов
/ 18 сентября 2018

Вы можете использовать следующий код, который захватывает текст после второго подчеркивания

 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
0 голосов
/ 18 сентября 2018

Может быть, вы путаете «группы» с «спичками».Вы должны искать совпадения вашего регулярного выражения.Вот как вывести список всех совпадений вашего регулярного выражения в заданной строке:

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}");
0 голосов
/ 18 сентября 2018
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

0 голосов
/ 18 сентября 2018

Если все ваши строки выглядят так: { SOME_STRING} _ {YOUR_NUMBER} .itx , тогда вы можете использовать это решение (без регулярных выражений)

var arr = str.Split(new[] {"_", ".itx"}, StringSplitOptions.RemoveEmptyEntries);
var result = arr[arr.Length - 1];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...