Пример соответствия С# 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
Спасибо заранее.
Ответы
Ответ 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);
Я думаю, будет делать трюк (не тестировался).