Я прочитал другие темы с похожими проблемами. Но никаких конкретных для этого случая - что, если у меня есть короткие коды того же типа, заключенные в основной код
Итак, это короткий код - http://regexr.com/3a1r6
вход
[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar] ceva [cigar] [cigar] [cigar] alceva [/cigar] [/cigar] [/cigar]
Тестовое регулярное выражение
\[cigar].*?\[\/cigar\]
Правильный вывод будет -
[cigar] [cigar] [cigar] ceva [/cigar] [/cigar] [/cigar]
не
[cigar] [cigar] [cigar] ceva [/cigar]
Любые решения?
Просто добавьте отрицательное утверждение, как показано ниже,
\[cigar].*?\[\/cigar\](?!\s*\[\/)
(?!\s*\[\/)
Отрицательный lookahead утверждает, что за совпадением будет следовать любое, но не одно или несколько пробелов, а затем [/
symbols.
В зависимости от того, что вы делаете, это не имеет значения.
Скажем, я пишу синтаксический анализатор BBCode, и мне приходится иметь дело с: [b] [b] [b] Triple bold for some reason! [/b] [/b] [/b]
Поэтому у меня есть регулярное выражение, скажем /\[b\](.*?)\[\/b\]/
=> "<b>$1</b>"
Если я повторно применяю замену до тех пор, пока она больше ничего не изменит, результатом будет: <b> <b> <b> Triple bold for some reason! </b> </b> </b>
Что касается браузера, у меня есть три совершенно допустимых вложенных элемента, хотя, когда я разбирал их, я не делал их извне внутрь.
Другая альтернатива - совпадение от последней к первой. Это будет сделано с /\[b\](.*?)\[\/b\](?!.*\[b\])/
Это будет соответствовать последнему [b]
и первому [/b]
который следует за ним, другими словами, самой внутренней вложенной паре. Опять же, повторное приложение до тех пор, пока ничего не изменится, приведет к анализу всех пар, но на этот раз они фактически будут разбираться в "правильном" порядке. (Обратите внимание, что указанное выше регулярное выражение может быть медленным или неэффективным на больших входах - используйте с осторожностью)