Регулярное выражение для сопоставления нескольких слов, заключенных в фигурные скобки, разделенных/разделенных символом подчеркивания, НО игнорирующих символы в начале/конце строки?

Я просто пытаюсь получить выражение Regex, которое будет соответствовать значениям ниже:

{{word1}}_{{word2}}_{{word3}}      // MATCH
_{{word1}}_{{word2}}_{{word3}}.    // NO MATCH
{{word1}}_word{{word2}}_{{word3}}  // NO MATCH
{{word1}}_{{word2}}_{{word3}}word4 // NO MATCH
{{word1}}_{{word2}}_{{word3}}_     // NO MATCH
_{{word1}}_{{word2}}_{{word3}}_    // NO MATCH
{{word1}}_{{word2))_{{word3}}      // NO MATCH
+{{word1}}-{{word2}}_{{word3}      // NO MATCH

Таким образом, в основном шаблон представляет собой две фигурные скобки ({{ и }}), заключающие в себе какое-то слово (\w+), разделенные или разделенные символом подчеркивания (_). Не должно быть никаких символов перед началом строки или в конце.

Проблема, с которой я столкнулся, связана с моим регулярным выражением, оно будет соответствовать значениям, которые существуют вне строки, например, это то, что я сейчас использовал:

\b({{\w+}})(\b_\b)*

Таким образом, это будут строки, которые являются word{{word}}_{{word2}}_, и сделают их действительными.

Это должно быть ровно три слова?

markspace 23.03.2022 02:26

Могут ли быть другие символы до или после выражения в той же строке? Другими словами, вы ожидаете, что сможете найти совпадение в пределах "word1 {{word2}}_{{word3}}_{{word4}} word5"?

Dawood ibn Kareem 23.03.2022 02:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
^{{\w+}}(?:_{{\w+}})*$

ОБЪЯСНЕНИЕ

^ asserts position at start of a line
{{ matches the characters {{ literally (case sensitive)
\w matches any word character (equivalent to [a-zA-Z0-9_])
+ matches the previous token between one and unlimited times, as many times as possible, giving back as needed (greedy)
}} matches the characters }} literally (case sensitive)
Non-capturing group (?:_{{\w+}})*
* matches the previous token between zero and unlimited times, as many times as possible, giving back as needed (greedy)
_{{ matches the characters _{{ literally (case sensitive)
\w matches any word character (equivalent to [a-zA-Z0-9_])
+ matches the previous token between one and unlimited times, as many times as possible, giving back as needed (greedy)
}} matches the characters }} literally (case sensitive)
$ asserts position at the end of a line

https://regex101.com/r/UJ0GdY/2

Я обновил регулярное выражение, чтобы избежать извлечения групп.

earandap 23.03.2022 02:33

спасибо @earandap. Я думаю, что я тупой, я не мог придумать решение весь день. это выглядит великолепно, большое спасибо

ennth 23.03.2022 03:24

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