Подтвердить что ты не робот

Regex для получения текста МЕЖДУ двумя символами

ПОЖАЛУЙСТА ПРОЧИТАЙТЕ ВНИМАТЕЛЬНО: Это немного необычно, и у вас возникнет соблазн сказать такие вещи, как "это не то, как использовать регулярное выражение" или "чувак", просто используйте String.SubString(), "Etc...

Мне нужно написать регулярное выражение (использовать уже существующий метод), который будет соответствовать текстовым BETWEEN фигурным скобкам, а не фигурные фигурные скобки.

Пример: "{MatchThisText}" И "La la la {MatchThisText} la la la..."
Должны оба матча: "MatchThisText"

Кто-то задал этот точный вопрос год назад, и он получил множество решений для регулярных выражений, которые будут соответствовать фигурным скобкам в дополнение к "MatchThisText", в результате чего совпадение "{MatchThisText}", которое не соответствует ему (или мне).

Если кто-то может написать Regex, который на самом деле соответствует только символам МЕЖДУ фигурными фигурными скобками, я бы очень признателен. Он должен допускать любые значения ASCII и должен останавливать совпадение в FIRST закрывающей скобке.

Пример: "{retailCategoryUrl}/{filters}"
Должен соответствовать: retailCategoryUrl и фильтры
Но не соответствие:" retailCategoryUrl}/{filters" (Все, кроме внешних фигурных скобок)

Эй, это очень сложно для меня, поэтому, пожалуйста, простите вопрос, если это тривиально для некоторых из вас.

СПАСИБО!

4b9b3361

Ответ 1

Python:

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

В контексте:

#!/usr/bin/env python

import re

def f(regexStr,target):
    mo = re.search(regexStr,target)
    if not mo:
        print "NO MATCH"
    else:
        print "MATCH:",mo.group()

f(r"(?<={)[^}]*(?=})","{MatchThisText}")
f(r"(?<={)[^}]*(?=})","La la la {MatchThisText} la la la...")

печатает:

MATCH: MatchThisText
MATCH: MatchThisText

Ответ 2

Если вы используете движок RegExp с поддержкой lookahead и lookbehind, например Python, вы можете использовать

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

Если это не так (например, javascript), вы можете использовать /{([^}]*)}/ и получить соответствие подстроки. Пример Javascript:

"{foo}".match(/{([^}]*)}/)[1] // => 'foo'

Ответ 3

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

{(.*?)}

Затем вам нужно получить значение от group номер 1 в вашем API-интерфейсе regex. (Как вы это делаете, зависит от вашего языка программирования/API.)

Ответ 4

текущий ответ работает с .NET Regex, но нужно удалить фигурные скобки из всех совпадений:

var regex = new Regex(@"(?<={)[^}]*(?=})", RegexOptions.Compiled);
var results = regex.Matches(source)
                   .Cast<Match>()
                   .Select(m => m.Value.TrimStart('{').TrimEnd('}'));

Ответ 5

В Javascript вы получаете массив со всеми совпадениями. Вот пример, который обрабатывает текст между css` и `для обработки строк шаблона:

yourstring.match(/css`([^}]+).`/gmi)