Regex соответствия вещи, которые я не хочу снова - PullRequest
1 голос
/ 11 марта 2019

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

В любом случае у меня есть эта строка:

[[{{6^-2}}x{{6^3}}|{{6^-2}}]]

Я хочу соответствоватьследующее регулярное выражение:

\[\[(.*?)\^(.*?)\]\]

Таким образом, в основном желая изолировать, если эта строка имеет [[что-нибудь ^ что-нибудь]]

Это работает до некоторой степени, но это также соответствует, потому что это ^ символ там.Я не хочу, чтобы это совпадало с этим, это выражение не должно совпадать, потому что символ - |, а не ^ в квадратных скобках.

По сути, он должен игнорировать части внутри {}

РЕДАКТИРОВАТЬ, ЧТОБЫ УЗНАТЬ БОЛЬШЕ:

Пример строки: [[{{hello ^ test}} | {{goodbye}}]] Мой образец: [[(.?) \ ^ (. ?)]] Ожидаемое совпадение: ложно, потому что я хочу сопоставлять ^ только в том случае, если это часть внешней части строки, окруженной [[]], а не в том случае, если она находится внутри {{}}

Пример строки: [[{{hello ^ test}} ^ {{goodbye}}]] Мой шаблон: [[(. ?) \ ^ (. ?)]] Ожидаемое совпадение: Истина, поскольку обе стороны ^ внутри [[]] совпадают, игнорируя то, что находится внутри {{}}

Пример строки: [[{{hello ^ test}} ^ {{goodbye^ test}}]] Мой паттерн: [[(. ?) \ ^ (. ?)]] Ожидаемое совпадение: Истина, потому что опять ^ находится между двумя частями в {{}} и долженигнорировать то, что находится внутри {{}}

Пример строки: [[{{hello ^ test}} | {{goodbye ^ test}}]] Мой шаблон:[[(. ?) \ ^ (. ?)]] Ожидаемое совпадение: Ложь, потому что нет ни одного ^ внутри [[]] только внутри {{}}, которое следует игнорировать

Мой шаблон не работает, потому что он также берет символ ^ внутри {{}} и соответствует любой его стороне, мне нужно, чтобы он совпадал с любой стороной ^, которая заключена в [[]], а не в{{}}

Надеюсь, это имеет смысл ..

Ответы [ 2 ]

1 голос
/ 11 марта 2019
\[\[(\{\{.+?\}\}|[^^{}]+)\^(.+?)\]\]

Объяснение:

\[\[            # 2 opening square brackets
(               # start group 1
    \{\{        # 2 opening curly braces
    .+?         # 1 or more any character, not greedy
    \}\}        # 2 closing curly braces
  |             # OR
    [^^{}]+     # 1 or more NON carret or curly braces
)               # end group 1
\^              # a carret
(.+?)           # group 2, 1 or more any characters, not greedy
\]\]            # 2 closing square brackets

Демо

0 голосов
/ 11 марта 2019

Попробуйте этот шаблон: ^[^{]*(?=({.*?(?1)?.*?})*[^{]*\^).+$

Он использует рекрусию, чтобы гарантировать, что символ ^ не будет находиться внутри фигурных скобок.Вместо объяснения всего регулярного выражения, я рекомендую прочитать о рекурсии регулярного выражения (например, здесь ).Тогда регулярное выражение будет легко понять.

Демо

...