2013-05-02 2 views
-1

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

[если-аЬс] 12345 [если четкости] 67890 [/ если] [/ если]

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

/\[if-([a-z0-9-]*)\]([^\[if]*?)\[\/if\]/s 

Это соответствует внутренние скобки так же, как я хочу его. Однако, когда я заменяю текст 67890 текстом (например, abcdef), он не совпадает с ним.

[если-а] 12345 [если четкости] ABCDEF [/ если] [/ если]

Я хочу, чтобы иметь возможность соответствовать любым символам, включая разрывы строк, для другого открытия, за исключением кронштейн [if-.

+0

Написать текст без «я» или «F» в нем, он будет работать. В вашем регулярном выражении есть ошибка – DhruvPathak

ответ

1

Эта часть не работает, как вы думаете, что делает:

[^\[if] 

Это будет соответствовать символу, который ни один из [, i или f. Независимо от комбинации. Вы можете имитировать желаемое поведение с помощью negative lookahead хотя:

~\[if-([a-z0-9-]*)\]((?:(?!\[/?if).)*)\[/if\]~s 

Я также включил закрывающие теги в упреждающей выборке, так как это избежать ungreedy повторения (который, как правило, хуже, производительность мудрым). Кроме того, я изменил разделители, так что вам не нужно избегать косой черты в шаблоне.

Так что это интересная часть ((?:(?!\[/?if).)*) объяснил:

(  # capture the contents of the tag-pair 
    (?:  # start a non-capturing group (the ?: are just a performance 
      # optimization). this group represents a single "allowed" character 
    (?! # negative lookahead - makes sure that the next character does not mark 
      # the start of either [if or [/if (the negative lookahead will cause 
      # the entire pattern to fail if its contents match) 
     \[/?if 
      # match [if or [/if 
    )  # end of lookahead 
    .  # consume/match any single character 
)*  # end of group - repeat 0 or more times 
)   # end of capturing group 
+0

Ваша функция работает, спасибо .. а также спасибо за объяснение, мне придется пройти через нее еще несколько раз, чтобы получить ее – user2103849

-1

Используйте период, чтобы соответствовать любому персонажу.

+1

Используйте период, в котором, зачем использовать период - что он делает? Как это изменится? –

+0

Осторожно прочитайте мой комментарий. Msgstr "Использовать период для соответствия любому персонажу".Итак, по вашему вопросу «Я хочу совместить любого персонажа», вы бы использовали период «.». Для соответствия любому персонажу. Хотя, основываясь на вашем комментарии, я настоятельно рекомендую вам вернуться и прочитать соответствующее руководство по регулярному выражению. – Chad

+0

Я отправил комментарий, чтобы поддержать нижний план, который я применил к ответу. «Использовать период, чтобы соответствовать любому персонажу» вряд ли является решением проблемы, представленной в то время, когда она затрагивает небольшую часть текста, указанного в сообщении. –

0

Изменение немного результатов в:

/\[if-([a-z0-9-]+)\](.+?)(?=\[if)/s 

Запуск его на [if-abc] 12345 [if-def] abcdef [/if][/if]

Результаты в первом матче, как: [if-abc] 12345

ваших групп: abc и 12345

И изменения еще ниже:

/\[if-([a-z0-9-]+)\](.+?)(?=(?:\[\/?if))/s 

соответствует обеим группам. Хотя разделитель [/if] не захвачен ни одним из них.

Примечание: Вместо сопоставление разделителей я использовал предпросмотр ((?=)) в регулярном выражении, чтобы остановить, когда текст вперед соответствует предпросмотру.

+0

Я думаю, что цель состоит в том, чтобы совместить только внутреннюю пару, а не внешнюю или обе. –

+0

@ m.buettner Почему нужно совместить только одно с регулярным выражением, если вы можете сопоставить несколько? У него больше, чем один в строке, поэтому в какой-то момент нужно было бы подбирать. –

+0

Это вложенная структура ... так что совпадение '[if-abc] 12345' кажется неполным/бесполезным для меня. Поскольку подсчет уровней вложенности трудно переопределить в регулярном выражении, имеет смысл сопоставить только самую внутреннюю пару (возможно, заменить ее чем-то другим, чтобы можно было повторить процесс и работать изнутри). Кроме того, это просто то, что ОП задает в вопросе. –

Смежные вопросы