У меня есть такая строка:
{abc}@{defgh}mner{123}
Как я могу получить все строки между { и } в виде массива или списка?
Нравится:
{ {abc},{defgh},{123} }
Использование регулярных выражений с группами захвата
да, я пишу цикл для получения строк между {и}, но это не лучший способ. @ shree.pat18
Возможен ли такой {abc}}}@{defgh}mner{123}? Или это asd{asd?
@radin откуда ты знаешь, что петля - не лучший способ? Разместите свой код, чтобы мы могли вам сообщить. Также сообщите нам, что для вас «лучше всего»
Возможный дубликат Получить значения между фигурными скобками с # и многие другие.
@FCin Да, возможно.
@CaiusJard, я сделал это ссылка на сайт. но моя строка другая. {asd{asd}dd}34{wqw}
Да, я думаю, что внесенные вами изменения сделают недействительными многие ответы здесь. Мы также не можем публиковать больше ответов, потому что этот вопрос закрыт как дубликат. Задайте новый вопрос, и поставьте отредактированную версию; {a {b} c} d {e} очень отличается от требования {a} b {c} d {e} и, вероятно, требует цикла, который считает фигурные скобки и выдает текст только тогда, когда счет становится 0
@CaiusJard Хорошо, спасибо.
@BACON Я редактирую этот вопрос, пожалуйста, проверьте его.
@radin этот вопрос был закрыто как дубликат, как и ваш исходный вопрос. Новое дополнение меняет объем вопроса, и поэтому лучше, если вы просто откроете новый (в общем). В данном конкретном случае этот вопрос здесь точно отвечает на вашу потребность: stackoverflow.com/questions/2778532/…





использование Regex - хороший выбор
string str = "{abc}@{defgh}mner{123}";
foreach (Match match in Regex.Matches(str,"{[^}]+}"))
{
Console.WriteLine(match.Value);
}
Используя такие сайты, как RegExr, вы можете легко попробовать свое регулярное выражение, прежде чем использовать его в коде:
string str = "{abc}@{defgh}mner{123}";
foreach (Match match in Regex.Matches(str,"(\{.+?\})"))
{
Console.WriteLine(match.Value);
}
var input = "{abc}@{defgh}mner{123}";
var pattern = @"\{(.+?)\}";
var matches = Regex.Matches(input, pattern);
IList<string> output = new List<string>();
foreach (Match match in matches)
output.Add(match.Groups[0].Value);
Простая версия
var input = "{abc}@{defgh}mner{123}";
var pattern = @"\{(.+?)\}";
var matches = Regex.Matches(input, pattern);
IList<string> output = matches.Cast<Match>().Select(x => x.Groups[0].Value).ToList();
output.Dump();
Вы можете использовать Regex
var str = "{abc}@{defgh}mner{123}";
var regex = new Regex(@"({\w+})",RegexOptions.Compiled);
var result = regex.Matches(str).Cast<Match>().Select(x=>x.Value);
результат - IEnumerable<string>, как требуется в OP
Выход (значение результата)
{abc}
{defgh}
{123}
Использование Regex и превращение их в список с помощью LINQ
var l = new Regex(@"\{(\w+)\}")
.Matches("{abc}@{defgh}mner{123}l")
.Cast<Match>()
.Select(m => m.Groups[0].Value)
.ToList();
Как это работает:
Регулярное выражение {(\ w +)} означает:
Это найдет весь текст между фигурными скобками
Регулярное выражение даст MatchCollection
Мы должны использовать Cast, чтобы превратить его в то, что linq может запрашивать
Мы. Выбираем элементы из коллекции, m - это отдельный элемент, m.Groups [0]. Значение - это текст, захваченный группой, в фигурных скобках
.ToList возвращает все тексты в одном списке
Вы можете попробовать следующий код, он не использует регулярные выражения, поэтому вам не нужно его знать!
static void Main(string[] args)
{
string s = "{abc}@{defgh}mner{123}";
int i1, i2 = 0;
while ((i1 = s.IndexOf('{', i2)) >= 0)
{
i2 = s.IndexOf('}', i1);
// Here you can add Substring result to some list or assign it to a variable...
Console.WriteLine(s.Substring(i1 + 1, i2 - i1 - 1));
}
}
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string pattern = @"{([A-Za-z0-9\-]+)}" ;
string input = "{abc}@{defgh}mner{123}";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value);
}
Console.WriteLine();
}
}
Output :
abc
defgh
123
Вы можете проверить выполнение кода онлайн: http://tpcg.io/uuIxo1
Вы уже что-нибудь пробовали? Есть несколько способов сделать это