#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);
}
}