Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Регулярное выражение


Автор: whoever 17.2.2008, 03:14
Как будет выглядеть регулярное выражение для "любые символы, кроме двух подряд идущих Х (один Х можно)". Пока только '((?!Х{2}).)*' пришло в голову, но чуется, что долго работать будет.
Решение искалось и ранее в теме http://forum.vingrad.ru/topic-139064.html#st_0_view_0, но не нашлось.

поправка: приведенное "решение" тоже оказалось неверным.

Автор: nornad 17.2.2008, 06:48
А по-старинке (вырезать все нехорошие последовательности при помощи replaceAll) - никак?
Если нет, то объясни прямо, ради чего это вообще требуется - может, не регулярками что предложим...

Автор: whoever 17.2.2008, 11:56
Нужно заменить по шаблону:
"тра-та-та {{текст[[XXXXX]]текст}} тра-та-та" - в подобной строке нужно заменить {{текст[[XXXXX]]текст}} на "текст XXXXX текст" (вместо XXX еще и подставить что-то), либо вырезать все между {{ и }}, в зависимостри от ситуации.

Автор: v2v 17.2.2008, 12:42
количество повторяемых символов изменяющееся или постоянное?
повторяется какой то определённый символ, или не известно какой символ будет повторятся?

Автор: whoever 17.2.2008, 12:44
Символов повторяющихся всегда два (в данном случае это {{, }}, [[ и ]]).

Автор: smartov 17.2.2008, 14:27
whoever, получается что тебе нужно сначала найти все вхождения {{моя_строка}}, а потом работать уже с вхождениями.

Добавлено через 1 минуту и 2 секунды
Вроде ничего сложного. Не пойму зачем искать "все кроме двух подряд"

Автор: whoever 17.2.2008, 15:46
"Все кроме двух подряд" - это для составления подобного выражения:
{{
все-кроме-двух-подряд-[
две-подряд-[
все-кроме-двух-подряд-]
две-подряд-]
все-кроме-двух-подряд-}
две-подряд-}

Автор: smartov 17.2.2008, 17:31
whoever, может попробовать наоборот? ... хотя без отключения жадности все равно не обойтись...

Добавлено через 5 минут и 25 секунд
Попробовал накидать на php - вроде оптимальнее через callback функции. Может пригодится.

Код

<?

function figureBrackets($match) {
    return preg_replace_callback('/\[\[(.*)\]\]/U', 'squareBrackets', $match[1]);
}

function squareBrackets($match) {
    return $match[1] == 'камнеедок' ? 'попугаев' : $match[1];
}

$string = 'Восемь {{больших зеленых [[камнеедок]] пили [[чай]] в саду}} и решали уравнение в котором {{были символ }, ] и другие}}';

$string = preg_replace_callback('/\{\{(.*)\}\}/U', 'figureBrackets', $string);

echo $string;

?>

Автор: whoever 17.2.2008, 18:09
smartov, а разве жадность отключать не нужно? Дважды (для фигурных и квадратных скобок) будет захвачена наиболее длинная строка в примере. Нет ли в j2se чего-либо похожего на preg_replace_callback?
На данный момент лучшее найденное решение:
Код

((?!XX)((?!X)|(?<!X)).)*
где X - нужные символы.

Но действует на последовательность из X любой длины, начиная с 2-х.

Автор: smartov 17.2.2008, 18:49
whoever, 
Цитата(whoever @  17.2.2008,  17:09 Найти цитируемый пост)
а разве жадность отключать не нужно? 

Нужно, я отключил. Просто в php это делается глобально - модификатор U (Ungreedy) в конце рег выражения.

Цитата(whoever @  17.2.2008,  17:09 Найти цитируемый пост)
j2se чего-либо похожего на preg_replace_callback

Прости, я не джавист smile Пролистал до диагонали регы в джаве - может у matcher-a есть какой-нибуь iterate. А так нужно у явистов просить  smile 

Автор: whoever 17.2.2008, 19:17
smartov, спасибо за помощь:)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)