Проблемы с регулярным выражением в c #, возвращающим только одно совпадение

#c# #regex

#c# #регулярное выражение

Вопрос:

Я создаю регулярное выражение, и мне чего-то не хватает, поскольку оно не работает должным образом. моя логика регулярных выражений пытается искать все, что имеет #anychars # и возвращает количество совпадений в предложении, а не одно совпадение. Вот несколько примеров

1- #_Title_# and #_Content_# должен возвращать два совпадения : #_Title_# and #_Content_# .

2- Product #_TemplateName_# #_Full_Product_Name_# more text. text text #_Short_Description_# должно возвращать 3 совпадения: #_TemplateName_# #_Full_Product_Name_# и #_Short_Description_#

и так далее. Вот как выглядит мое регулярное выражение: ^(.*#_.*_#.*) $

есть мысли о том, что я делаю неправильно?

Комментарии:

1. Вы сопоставляете #anychars# #_anychars_#

2. Я обновил вопрос, поскольку форматирование вводило в заблуждение.

Ответ №1:

Что-то такое простое, как:

 #.*?#
 

Или:

 #_.*?_#
 

Если вы тоже пытаетесь сопоставить символы подчеркивания (это было неясно в первоначальной версии вопроса). Или:

 #_(.*?)_#
 

Что упрощает извлечение токена между вашими #_ _# разделителями и как группы.

Должно сработать. Ключ *? is . Он не жадный. В противном случае вы сопоставляете все между первым и последним #

Так, например:

 var str = "Product #_TemplateName_# #_Full_Product_Name_# more text. text text #_Short_Description_#";

var r = new Regex("#_(.*?)_#");

foreach (Match m in r.Matches(str)) 
{
    Console.WriteLine(m.Value   "t"   m.Groups[1].Value);
}
 

Выводит:

 #_TemplateName_#         TemplateName
#_Full_Product_Name_#    Full_Product_Name
#_Short_Description_#    Short_Description
 

Ответ №2:

Попробуйте это :

             string[] inputs = {
                                  "#Title# and #Content#",
                                  "Product #TemplateName# #_Full_Product_Name_# more text. text text #_Short_Description_#"
                              };

            string pattern = "(?'string'#[^#] #)";

            foreach (string input in inputs)
            {
                MatchCollection matches = Regex.Matches(input, pattern);
                Console.WriteLine(string.Join(",",matches.Cast<Match>().Select(x => x.Groups["string"].Value).ToArray()));
            }
            Console.ReadLine();
 

Ответ №3:

Ваше регулярное выражение неверно. Кроме того, вы хотите перебирать совпадения, если хотите, чтобы все совпадали.

 static void Main(string[] args)
{
    string input = "Product #_TemplateName_# #_Full_Product_Name_# more text. text text #_Short_Description_#",
        pattern = "#_[a-zA-Z_]*_#";
    Match match = Regex.Match(input, pattern);
    while (match.Success)
    {
        Console.WriteLine(match.Value);
        match = match.NextMatch();
    }
    Console.ReadLine();
}
 

Результат

введите описание изображения здесь

Ответ №4:

Не используйте якоря и измените свое регулярное выражение на:

(#[^#] #)

В регулярном [^#] выражении выражение означает любой символ, НО #

 using System;
using System.Text.RegularExpressions;

public class Example
{
   public static void Main()
   {
      string pattern = @"(#[^#] #)";
      Regex rgx = new Regex(pattern);
      string sentence = "#blah blah# asdfasdfaf #somethingelse#";

      foreach (Match match in rgx.Matches(sentence))
     Console.WriteLine("Found '{0}' at position {1}", 
               match.Value, match.Index);
   }
}