Regex PCRE: проверка строки для соответствия первому набору строк вместо последнего

Я пробовал немало вещей, но Im застрял с моим регулярным выражением, когда он отвечал критериям 2 раза подряд. В этом случае он просто рассматривает это как одно выражение вместо 2.

\[ame\=[^\.]+(.+)youtube\.(.+)v\=([^\]\&\"]+)[\]\'\"\&](.+)\[\/ame\]

Например

[AME = "http://www.youtube.com/watch?v=brfr5CD2qqY"] [B] [COLOR = желтый] http://www.youtube.com/watch?v=brfrx5D2qqY [/COLOR] [/B] [/ame] [/U] [B] [COLOR = желтый] или [/COLOR] [/B] [B] [COLOR = желтый] B [/COLOR] [/B] [ame = "http://www.youtube.com/watch?v=M9ak3rKIBAU"][B][COLOR=yellow]http://www.youtube.com/watch?v=M9a3arKIBAU[/COLOR][/B][/ame] [B] [COLOR = желтый] или [/COLOR] [/B] [B] [COLOR = желтый] C [/COLOR] [/B] [ame = "http://www.youtube.com/watch? v = 7vh - 3pyq5U "] [COLOR = желтый] http://www.youtube.com/watch?v=7vh--3pyq5U [/COLOR] [/AME]

В этом случае это регулярное выражение вместо сопоставления всех 3 вариантов, оно принимает его как одно.

Любые идеи, как сделать выражение, которое будет соответствовать первому "[/ame]"?

2 ответа

Проблема заключается в использовании .+ - они "жадные", что означает, что они будут потреблять как можно больше вклада и по-прежнему совпадать.

Измените их на неохотные кванторы:. .+? , который не будет пропустить вперед в конце первого совпадения, чтобы соответствовать концу, если последнее совпадение.


Я не уверен, какова ваша цель (вы еще этого не сделали)

Но это будет соответствовать и отображать URL-адрес youtube для вас, гарантируя, что вы будете соответствовать только одному экземпляру между [ame= и [/ame]

/\[ame=["'](.*?)["'](.*?)\/ame\]/i

Вот рабочий пример и отличная песочница для игры в: http://regex101.com/r/jR4lK2

licensed under cc by-sa 3.0 with attribution.