Получить все строки между двумя символами в строке

У меня есть такая строка:

{abc}@{defgh}mner{123}

Как я могу получить все строки между { и } в виде массива или списка?

Нравится:

{ {abc},{defgh},{123} }

Вы уже что-нибудь пробовали? Есть несколько способов сделать это

shree.pat18 08.01.2019 07:41

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

Caius Jard 08.01.2019 07:43

да, я пишу цикл для получения строк между {и}, но это не лучший способ. @ shree.pat18

radin 08.01.2019 07:44

Возможен ли такой {abc}}}@{defgh}mner{123}? Или это asd{asd?

FCin 08.01.2019 07:48

@radin откуда ты знаешь, что петля - не лучший способ? Разместите свой код, чтобы мы могли вам сообщить. Также сообщите нам, что для вас «лучше всего»

Caius Jard 08.01.2019 07:57

Возможный дубликат Получить значения между фигурными скобками с # и многие другие.

Lance U. Matthews 08.01.2019 07:57

@FCin Да, возможно.

radin 08.01.2019 09:56

@CaiusJard, я сделал это ссылка на сайт. но моя строка другая. {asd{asd}dd}34{wqw}

radin 08.01.2019 10:06

Да, я думаю, что внесенные вами изменения сделают недействительными многие ответы здесь. Мы также не можем публиковать больше ответов, потому что этот вопрос закрыт как дубликат. Задайте новый вопрос, и поставьте отредактированную версию; {a {b} c} d {e} очень отличается от требования {a} b {c} d {e} и, вероятно, требует цикла, который считает фигурные скобки и выдает текст только тогда, когда счет становится 0

Caius Jard 08.01.2019 10:07

@CaiusJard Хорошо, спасибо.

radin 08.01.2019 10:11

@BACON Я редактирую этот вопрос, пожалуйста, проверьте его.

radin 08.01.2019 10:46

@radin этот вопрос был закрыто как дубликат, как и ваш исходный вопрос. Новое дополнение меняет объем вопроса, и поэтому лучше, если вы просто откроете новый (в общем). В данном конкретном случае этот вопрос здесь точно отвечает на вашу потребность: stackoverflow.com/questions/2778532/…

Sascha Wolf 08.01.2019 11:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
12
1 138
7

Ответы 7

использование 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);
}

https://regexr.com/460a3

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 +)} означает:

  • {: Найди {
  • (: начать захват группы данных
  • \ w +: соответствует одному или нескольким символам слова (от a до z, от 0 до 9)
  • ): конец захвата
  • ): Найди }

Это найдет весь текст между фигурными скобками

Регулярное выражение даст 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

Другие вопросы по теме