Intereting Posts
Как добавить файлы в существующий zip-архив Как «импортировать» статический class в C #? проверка текстового поля в приложении Windows Form Использование ранее сгенерированного открытого / закрытого ключа RSA с инфраструктурой .net Переменные среды Process.Start () и PATH Шифровать ConnectionString в структуре сущности (первый код) Как закодировать индикатор выполнения для Windows 7, чтобы также обновить себя на панели задач? как работает PropertyChangedEventHandler? Как проверить, существует ли изображение в http: //someurl/myimage.jpg в C # / ASP.NET? Обнаружение, если программа была запущена Visual Studio, в отличие от запуска из проводника Windows Почему classы в настоящее время определяются как интерфейс? Identity 2.0: создание пользовательской ClaimsIdentity, например: User.Identity.GetUserById (int id) для проверки запроса EntitySet System.InvalidOperationException – «тип сущности не является частью модели для текущего контекста» Найти наиболее часто встречающиеся числа в массиве, используя LINQ BeginCollectionItem частично в частичном неправильном ведении

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

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

Если я использую Regex ({[^}]*}) мои значения 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(); 

Мне это всегда нравилось. Таким образом, вы можете использовать «положительный lookbehind» (? < = ...) и «положительный lookahead» (? = ...) группы:

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

что значит:

  • перед открытием нужно открыть фигурные скобки
  • собирать текст (из, конечно) - как прокомментировано, прежде чем я могу быть [^ {}] *
  • требуют закрытия фигурного скобки после матча

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

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

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

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

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

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

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

Вот пример кода :

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

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

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

Спасибо Милош Краевский, ничего добавить, но вот функция

 private List GetTokens(String str) { Regex regex = new Regex(@"(?< =\{)[^}]*(?=\})", RegexOptions.IgnoreCase); MatchCollection matches = regex.Matches(str); // Results include braces (undesirable) return matches.Cast().Select(m => m.Value).Distinct().ToList(); } 

Просто переместите фигурные скобки вне круглых скобок:

  {([^}]*)} 

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

 @"{(.*?)}" 

он отображает

token1 token2

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