Подтвердить что ты не робот

Пример соответствия С# regex

Я пытаюсь получить значения, используя следующий текст, любые мысли, которые можно сделать с помощью Regex?

Ввод: Lorem ipsum dolor sit% загрузить% # 456 amet, consectetur adipiscing% загрузить% # 3434 elit. Duis non nunc nec mauris feugiat porttitor. Sed tincidunt blandit dui a viverra% download% # 298. Aenean dapibus nisl% загрузить% # 893434 id nibh auctor vel tempor velit blandit.

Выход:
456
3434
298
893434

Спасибо заранее.

4b9b3361

Ответ 1

Итак, вы пытаетесь захватить числовые значения, которым предшествует токен "% download% #"?

Попробуйте этот шаблон:

(?<=%download%#)\d+

Это должно сработать. Я не думаю, что # или % являются специальными символами в .NET Regex, но вам придется либо сбрасывать обратную косую черту, как \\, либо использовать verbatim string для всего шаблона:

var regex = new Regex(@"(?<=%download%#)\d+");
return regex.Matches(strInput);

Протестировано здесь: http://rextester.com/BLYCC16700

ПРИМЕЧАНИЕ.. Утверждение lookbehind (?<=...) важно, потому что вы не хотите включать %download%# в свои результаты, а только цифры после него. Однако ваш пример, кажется, требует его перед каждой строкой, которую вы хотите захватить. Группа lookbehind проверит ее там во входной строке, но не включит ее в возвращаемые результаты. Подробнее о утверждениях здесь.

Ответ 2

Все остальные ответы, которые я вижу, хороши, но С# имеет поддержку названных групп!

Я бы использовал следующий код:

const string input = "Lorem ipsum dolor sit %download%#456 amet, consectetur adipiscing %download%#3434 elit. Duis non nunc nec mauris feugiat porttitor. Sed tincidunt blandit dui a viverra%download%#298. Aenean dapibus nisl %download%#893434 id nibh auctor vel tempor velit blandit.";

static void Main(string[] args)
{
    Regex expression = new Regex(@"%download%#(?<Identifier>[0-9]*)");
    var results = expression.Matches(input);
    foreach (Match match in results)
    {
        Console.WriteLine(match.Groups["Identifier"].Value);
    }
}

Код, который читает: (? < Идентификатор > [0-9]) указывает, что результаты [0-9] будут частью названной группы, которую мы индексируем, как указано выше: match.Groups [ "Идентификатор" ]. Значение

Ответ 3

    public void match2()
    {
        string input = "%download%#893434";
        Regex word = new Regex(@"\d+");
        Match m = word.Match(input);
        Console.WriteLine(m.Value);
    }

Ответ 4

Похоже, что большинство сообщений здесь описывают, что вам нужно здесь. Однако, возможно, вам потребуется более сложное поведение - в зависимости от того, что вы анализируете. В вашем случае это может быть так, что вам не понадобится более сложный парсинг - но это зависит от того, какую информацию вы извлекаете.

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;

public class Info
{
    public String Identifier;
    public char nextChar;
};

class testRegex {

    const string input = "Lorem ipsum dolor sit %download%#456 amet, consectetur adipiscing %download%#3434 elit. " +
    "Duis non nunc nec mauris feugiat porttitor. Sed tincidunt blandit dui a viverra%download%#298. Aenean dapibus nisl %download%#893434 id nibh auctor vel tempor velit blandit.";

    static void Main(string[] args)
    {
        Regex regex = new Regex(@"%download%#(?<Identifier>[0-9]*)(?<nextChar>.)(?<thisCharIsNotNeeded>.)");
        List<Info> infos = new List<Info>();

        foreach (Match match in regex.Matches(input))
        {
            Info info = new Info();
            for( int i = 1; i < regex.GetGroupNames().Length; i++ )
            {
                String groupName = regex.GetGroupNames()[i];

                FieldInfo fi = info.GetType().GetField(regex.GetGroupNames()[i]);

                if( fi != null ) // Field is non-public or does not exists.
                    fi.SetValue( info, Convert.ChangeType( match.Groups[groupName].Value, fi.FieldType));
            }
            infos.Add(info);
        }

        foreach ( var info in infos )
        {
            Console.WriteLine(info.Identifier + " followed by '" + info.nextChar.ToString() + "'");
        }
    }

};

Этот механизм использует отражение С# для установки значения в класс. имя группы сопоставляется с именем поля в экземпляре класса. Обратите внимание, что Convert.ChangeType не принимает никакого мусора.

Если вы хотите добавить отслеживание строки/столбца - вы можете добавить дополнительное расщепление Regex для строк, но для сохранения целостности цикла все шаблоны соответствия должны иметь именованные группы. (В противном случае индекс столбца будет вычисляться неправильно)

Это приведет к следующему результату:

456 followed by ' '
3434 followed by ' '
298 followed by '.'
893434 followed by ' '

Ответ 5

Этот шаблон должен работать:

#\d

foreach(var match in System.Text.RegularExpressions.RegEx.Matches(input, "#\d"))
{
    Console.WriteLine(match.Value);
}

(Я не перед Visual Studio, но даже если это не компилируется как есть, оно должно быть достаточно близко, чтобы вникать в что-то, что работает).

Ответ 6

Regex regex = new Regex("%download#(\\d+?)%", RegexOptions.SingleLine);
Matches m = regex.Matches(input);

Я думаю, будет делать трюк (не тестировался).