Обнаружить определенные токены в строке. С#
У меня очень большая строка (HTML), и в этом HTML есть специальные токены, где все они начинаются с "#" и заканчиваются на "#"
Простой пример
<html>
<body>
<p>Hi #Name#, You should come and see this #PLACE# - From #SenderName#</p>
</body>
</html>
Мне нужен код, который обнаружит эти токены и поместит его в список.
0 - # Имя #
1 - # Место #
2 - #SenderName #
Я знаю, что могу использовать Regex, может быть, у вас есть идеи сделать это?
Ответы
Ответ 1
Да, вы можете использовать регулярные выражения.
string test = "Hi #Name#, You should come and see this #PLACE# - From #SenderName#";
Regex reg = new Regex(@"#\w+#");
foreach (Match match in reg.Matches(test))
{
Console.WriteLine(match.Value);
}
Как вы могли предположить, \w обозначает любой буквенно-цифровой символ. Символ + означает, что он может отображаться 1 или более раз. Вы можете найти более подробную информацию здесь msdn doc (для .Net 4. Также вы найдете другие версии).
Ответ 2
Вы можете попробовать:
// using System.Text.RegularExpressions;
// pattern = any number of arbitrary characters between #.
var pattern = @"#(.*?)#";
var matches = Regex.Matches(htmlString, pattern);
foreach (Match m in matches) {
Console.WriteLine(m.Groups[1]);
}
Ответ вдохновлен этим вопросом SO.
Ответ 3
Вариант без Regex
, если хотите:
var splitstring = myHtmlString.Split('#');
var tokens = new List<string>();
for( int i = 1; i < splitstring.Length; i+=2){
tokens.Add(splitstring[i]);
}
Ответ 4
foreach (Match m in Regex.Matches(input, @"#\w+#"))
Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
Ответ 5
Использование:
MatchCollection matches = Regex.Matches(mytext, @"#(\w+)#");
foreach(Match m in matches)
{
Console.WriteLine(m.Groups[1].Value);
}
Ответ 6
Наивное решение:
var result = Regex
.Matches(html, @"\#([^\#.]*)\#")
.OfType<Match>()
.Select(x => x.Groups[1].Value)
.ToList();
Ответ 7
попробуйте это
var result = html.Split('#')
.Select((s, i) => new {s, i})
.Where(p => p.i%2 == 1)
.Select(t => t.s);
Пояснение:
line1 - мы разделим текст символом "#"
line2 - мы выбираем новый анонимный тип, который включает в себя позицию строк в массиве, а сама строка
line3 - мы отфильтровываем список анонимных объектов тем, у кого есть значение нечетного индекса, - эффективно собираем строку "все остальные" - это вписывается в поиск тех строк, которые были обернуты хэш-символом, а не вне
line4 = мы отбрасываем указатель и возвращаем только строку из анонимного типа
Ответ 8
Решение Linq:
string s = @"<p>Hi #Name#,
You should come and see this #PLACE# - From #SenderName#</p>";
var result = s.Split('#').Where((x, y) => y % 2 != 0).Select(x => x);
Ответ 9
Используйте метод Regex.Matches
с шаблоном чего-то вроде
#[^#]+#
для шаблона.
Это, пожалуй, самый наивный способ.
Затем это может потребоваться отрегулировать, если вы хотите избежать включения символов "#" в совпадении вывода, возможно, с помощью поиска:
(?<=#)[^#]+(?=#)
(Соответствующее значение для этого было бы "hello" not '# hello #' - так что вам больше не нужно делать обрезку)
Ответ 10
Это дает вам список токенов по запросу:
var tokens = new List<string>();
var matches = new Regex("(#.*?#)").Matches(html);
foreach (Match m in matches)
tokens.Add(m.Groups[1].Value);
Изменить: Если вы не хотите включать символы фунта, просто переместите их за круглые скобки в строке Regex (см. ответ Pablo).