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

Обнаружить определенные токены в строке. С#

У меня очень большая строка (HTML), и в этом HTML есть специальные токены, где все они начинаются с "#" и заканчиваются на "#"

Простой пример

<html>
<body>
      <p>Hi #Name#, You should come and see this #PLACE# - From #SenderName#</p>
</body>
</html>

Мне нужен код, который обнаружит эти токены и поместит его в список. 0 - # Имя # 1 - # Место # 2 - #SenderName #

Я знаю, что могу использовать Regex, может быть, у вас есть идеи сделать это?

4b9b3361

Ответ 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).