Определите конкретные токены в строке.C # - PullRequest
13 голосов
/ 25 ноября 2010

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

Simple Eg

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

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

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

Ответы [ 10 ]

11 голосов
/ 25 ноября 2010

Да, вы можете использовать регулярные выражения.

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. Там вы найдете и другие версии).

10 голосов
/ 25 ноября 2010

Вы можете попробовать:

// 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]);
}

Ответ, вдохновленный этим ТАКИМ вопросом.

4 голосов
/ 25 ноября 2010

Вариант без Regex, если вам нравится:

var splitstring = myHtmlString.Split('#');
var tokens = new List<string>();
for( int i = 1; i < splitstring.Length; i+=2){
  tokens.Add(splitstring[i]);
}   
3 голосов
/ 25 ноября 2010

попробуйте

var result = html.Split('#')
                    .Select((s, i) => new {s, i})
                    .Where(p => p.i%2 == 1)
                    .Select(t => t.s);

Пояснение:

line1 - мы разбиваем текст по символу '#'

line2 - мы выбираем новый анонимный тип, который включает в себя положение строк в массиве и саму строку

line3 - мы фильтруем список анонимных объектов по тем, которые имеют нечетное значение индекса - эффективно выбирая «каждую вторую» строку - это подходит для нахождения тех строк, которые были заключены в хеш-символ, а не вне

line4 = мы убираем индексатор и возвращаем только строку из анонимного типа

3 голосов
/ 25 ноября 2010
foreach (Match m in Regex.Matches(input, @"#\w+#"))
    Console.WriteLine("'{0}' found at index {1}.",  m.Value, m.Index);
2 голосов
/ 25 ноября 2010

Наивный раствор:

var result = Regex
    .Matches(html, @"\#([^\#.]*)\#")
    .OfType<Match>()
    .Select(x => x.Groups[1].Value)
    .ToList();
2 голосов
/ 25 ноября 2010

Использование:

MatchCollection matches = Regex.Matches(mytext, @"#(\w+)#");

foreach(Match m in matches)
{
    Console.WriteLine(m.Groups[1].Value);
}
1 голос
/ 25 ноября 2010

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);
0 голосов
/ 25 ноября 2010

Это дает вам список токенов по запросу:

var tokens = new List<string>();
var matches = new Regex("(#.*?#)").Matches(html);

foreach (Match m in matches) 
    tokens.Add(m.Groups[1].Value);

Редактировать: Если вы не хотите включить символы фунта, просто переместитеих за скобками в строке Regex (см. ответ Пабло).

0 голосов
/ 25 ноября 2010

Используйте метод Regex.Matches с шаблоном, похожим на

#[^#]+# для шаблона.

Что, возможно, самый наивный способ.

Это, возможно, потребуется скорректировать, если вы хотите избежать включения символов '#' в выходное совпадение, возможно, с поиском:

(?<=#)[^#]+(?=#)

(Соответствующим значением для этого будет 'hello', а не '# hello #' - поэтому вам не нужно больше обрезать)

...