Убедитесь, что у вас установлены последние версии WordPress, ваша тема и все плагины.

(?<!{){[^{}]+}(?!})

Однако он не распространяется на случай пользователя № 3 (см. Ниже).

Я хотел бы знать, можно ли определить регулярное выражение, удовлетворяющее приведенным ниже вариантам использования.

Пример использования 1

Данный:

Hola {name}

Он должен соответствовать {name} и захватывать имя

Но я хотел бы иметь возможность избегать фигурных скобок, когда это необходимо, удваивая их, как это делает C # для интерполированных строк. Итак, в строке вида

Пример использования 2

Hola {name}, this will be {{unmatched}}

Часть {{unmatched}} следует игнорировать, поскольку она использует их удвоенные . Обратите внимание на {{ и }}.

Пример использования 3

В последнем, наиболее сложном случае, текст вроде этого:

Buenos {{{dias}}}

Текст {dias} должен совпадать (и фиксировать dias ), потому что первые крайние двойные фигурные скобки следует интерпретировать так же, как другой символ (они экранированы), поэтому он должен соответствовать: {{ {dias} }}

Моя конечная цель - позже заменить совпадения другой строкой, например переменной.

РЕДАКТИРОВАТЬ

Этот 4-й вариант использования в значительной степени обобщает все требования:

Как мне разместить свое текстовое представление под другим?

Результаты в:

  • Матч 1:
    • Соответствующий текст: {name}
    • Сохраненный текст: name
  • Матч 2:
    • Соответствующий текст: {dias}
    • Сохраненный текст: dias
1
SuperJMN 14 Янв 2021 в 13:06

1 ответ

Лучший ответ

Ты можешь использовать

(?<!{)(?:{{)*{([^{}]*)}(?:}})*(?!})

См. . Демонстрация регулярного выражения .NET .

В C # вы можете использовать

var results = Regex.Matches(text, @"(?<!{)(?:{{)*{([^{}]*)}(?:}})*(?!})").Cast<Match>().Select(x => x.Groups[1].Value).ToList();

В качестве альтернативы, чтобы получить полные совпадения, оберните левый и правый контексты в поисковые запросы:

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

См. эта демонстрация регулярного выражения . В C #:

var results = Regex.Matches(text, @"(?<=(?<!{)(?:{{)*{)[^{}]*(?=}(?:}})*(?!}))")
    .Cast<Match>()
    .Select(x => x.Value)
    .ToList();

Детали регулярного выражения

  • (?<=(?<!{)(?:{{)*{) - сразу слева должно быть ноль или более подстрок {{, которым непосредственно не предшествует символ {, а затем {
  • [^{}]* - ноль или более символов, кроме { и }
  • (?=}(?:}})*(?!})) - сразу справа должно быть }, ноль или более }} подстрок, за которыми сразу не следует символ }.
2
Wiktor Stribiżew 14 Янв 2021 в 10:37
65716941