C # Regex.Match фигурные скобки - только содержимое? (исключить скобки)

я не смог найти ответ на этот вопрос: могу ли я использоватьRegex.Matches способ вернуть толькосодержание предметов с фигурными скобками?

Если я использую регулярное выражение({[^}]*}) мойMatchCollection значения включают в себя скобки. Я хочу, чтобы соответствовать, но тогда только вернуть содержимое. Вот'Что я имею до сих пор:

Regex regex = new Regex(({[^}]*}), RegexOptions.IgnoreCase);
MatchCollection matches = regex.Matches("Test {Token1} {Token 2}");
// Results include braces (undesirable)
var results = matches.Cast().Select(m => m.Value).Distinct().ToList();

Ответы на вопрос(7)

нечего добавить, но вот функция

private List<string> GetTokens(String str)
{
    Regex regex = new Regex(@"(?<=\{)[^}]*(?=\})", RegexOptions.IgnoreCase);
    MatchCollection matches = regex.Matches(str);

    // Results include braces (undesirable)
    return matches.Cast<match>().Select(m => m.Value).Distinct().ToList();
}
</match></string>

Это регулярное выражение для C # .net.

@"{(.*?)}"

это отображать

токен1 токен2

 garlix04 апр. 2018 г., 10:49
Это приводит кmatch.Value содержащийтакже фигурные скобки. Что именно то, что автор вопроса хотел бы избежать

как и во многих других языках программирования, механизм регулярных выражений поддерживаетзахват групп, которыеsubmatchesчасти подстрок, которые соответствуют целому шаблону регулярных выражений, определенному в шаблоне регулярных выражений с помощью скобок (например,1([0-9])3 будет соответствовать123 и сохранить значение2 в буфер группы захвата 1). Захваченные тексты доступны черезMatch.Groups[n].Value где п индекс группы захвата внутри шаблона.

Захват намного эффективнее, чем обходные пути, Всякий раз, когда нет необходимости в сложных условиях, группы захвата являются гораздо лучшими альтернативами.

Смотрите мой тест скорости регулярных выражений, выполненный на regexhero.net:

Сейчас,Как мы можем получить подстроку внутри фигурных скобок?

если внутри нет других фигурных скобок, скласс отрицанных символов:{([^{}]*)если могут быть вложенные фигурные скобки:{((?>[^{}]+|{(?)|}(?<-c>))*(?(c)(?!)))

В обоих случаях мы сопоставляем отверстие{, а затем сопоставьте (1) любой символ, кроме{ или же}или (2) любые символы вплоть до первой пары.}

Вотобразец кода:

var matches = Regex.Matches("Test {Token1} {Token 2}", @"{([^{}]*)");
var results = matches.Cast<match>().Select(m => m.Groups[1].Value).Distinct().ToList();
Console.WriteLine(String.Join(", ", results));
matches = Regex.Matches("Test {Token1} {Token {2}}", @"{((?>[^{}]+|{(?<c>)|}(?<-c>))*(?(c)(?!)))");
results = matches.Cast<match>().Select(m => m.Groups[1].Value).Distinct().ToList();
Console.WriteLine(String.Join(", ", results));
</match></c></match>

Результат:Token1, Token 2Token1, Token {2}

Обратите внимание, чтоRegexOptions.IgnoreCase является избыточным, если у вас нет буквальных букв, которые могут иметь другой регистр в шаблоне.

Просто переместите скобки за скобки:

 {([^}]*)}
 Dirk14 мая 2013 г., 10:02
Должен ли набор[^}] быть изменен на[^{}]? Прямо сейчас регулярное выражение также соответствует{{{Hello}неужелине так ли?
 RichieHindle15 мая 2013 г., 10:36
@PeterX: Вам нужно посмотреть наCaptures изMatches, Захваты содержат кусочки в скобках.
 PeterX15 мая 2013 г., 01:32
regex.Matches Метод по-прежнему возвращает значения в фигурных скобках.

Немного изменив ответ @Milosz Krajewski

(?<=\{)[^}{]*(?=\})

это пропустит средние одинарные открывающие и закрывающие фигурные скобки в строке.

Решение Вопроса

й взгляд " (<?= ...) и "позитивный взгляд " (? = ...) группы:

(?<=\{)
[^}]*
(?=\})

что значит:

требуется открытие фигурной скобкидо матчсобирать текст (конечно же) - как я уже прокомментировал, прежде чем я смогу [^ {}] *требуется закрывающая фигурная скобкапосле матч
 PeterX15 мая 2013 г., 01:34
Да так полный(?

{([^}]*)}, Это будет захватывать только текст между {}, не включая их.

 PeterX15 мая 2013 г., 01:35
Это регулярное выражение приводит к ошибке:parsing "{([^]*)}" - Unterminated [] set.

Ваш ответ на вопрос