Соответствие регулярному выражению в условиях ColdFusion OR - PullRequest
1 голос
/ 01 июня 2009

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

Ниже приведен пример ввода:

You can make things **bold** or //italic// or **//both//** or //**both**//.

Character formatting extends across line breaks: **bold,
this is still bold. This line deliberately does not end in star-star.

Not bold. Character formatting does not cross paragraph boundaries.

Моя первая попытка была:

<cfset out = REreplace(out, "\*\*(.*?)\*\*", "<strong>\1</strong>", "all") />

Тогда я понял, что он не будет соответствовать там, где ** не указан, и должен заканчиваться там, где есть два возврата каретки.

Итак, я попробовал это:

<cfset out = REreplace(out, "\*\*(.*?)[(\*\*)|(\r\n\r\n)]", "<strong>\1</strong>", "all") />

и это близко, но по какой-то причине дает вам это:

You can make things <strong>bold</strong>* or //italic// or <strong>//both//</strong>* or //<strong>both</strong>*//.

Character formatting extends across line breaks: <strong>bold,</strong>
this is still bold. This line deliberately does not end in star-star.

Not bold. Character formatting does not cross paragraph boundaries.

Есть идеи?

PS: Если у кого-нибудь есть какие-либо предложения по улучшению тегов или улучшению заголовка для этого поста, я весь в ушах.

Ответы [ 5 ]

6 голосов
/ 01 июня 2009

[...] представляет класс символов, так что это:

[(\*\*)|(\r\n\r\n)]

Эффективно так же, как это:

[*|\r\n]

т.е. это соответствует единственному «*» и «|» не чередование.

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

В Perl я бы написал так:

$string =~ s/\*\*(.*?)(?:\*\*|(?=\n\n))/<strong>$1<\/strong>/sg;

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

REreplace(out, "\*\*(.*?)(?:\*\*|(?=\r\n\r\n))", "<strong>\1</strong>", "all")
1 голос
/ 21 января 2011

Я знаю, что это более старый вопрос, но в ответ на то, что Райан Гилл сказал: «Я пробовал 1 доллар, но он поставил буквальный 1 доллар вместо соответствия» для ColdFusion, вы должны использовать \1 вместо $1

1 голос
/ 01 июня 2009

Вы действительно должны изменить свой

(.*?) 

что-то вроде

[^*]*?

соответствует любому символу, кроме *. Я не знаю, в этом ли проблема, но это может быть любой персонаж. ест одну из ваших звезд. Это также общепринятая «лучшая практика» при попытке сбалансировать совпадающие символы, такие как двойная звезда или HTML-теги start / end, чтобы явно исключить их из набора совпадений для внутреннего текста.

* Отказ от ответственности, я не проверял это в ColdFusion на нюансы движка регулярных выражений - но идея должна сохраняться.

0 голосов
/ 08 июня 2009

Я нахожу это приложение очень полезным, когда я что-то делаю с регулярным выражением: http://www.gskinner.com/RegExr/desktop/ По-прежнему не помогает в решении вашей реальной проблемы, но может быть полезно в будущем.

0 голосов
/ 01 июня 2009

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

Попробуйте использовать ' $ 1 ' вместо \ 1 для этого - замена немного отличается ... но я думаю, что шаблон - это то, что вам нужно для работы.

Становясь ближе с этим:

** (.?) ** |? //(.) //

Хитрая часть - это // ** или ** //

Хорошо, сначала проверяем // полужирный // затем // полужирный // затем полужирный , затем // полужирный //

** // // ** (.?) | //**(.) ** // |? ** () ** |.? // ( . ?) //

...