Xpoint
   [напомнить пароль]

Запутался с условием в регулярке (если символ до символа, если последний не перед символом)

Метки: [без меток]
2009-10-20 19:56:49 [обр] Рубероид(0/21)[досье]

Запнулся на ровном месте.

Пишу регулярку "если в начале пробельные символы и пр. атрибуты начала слова или разные открывающиеся скобки, а далее любые символы либо до точки, либо до запятой, либо до закрывающих скобок, либо сразу до пробела, но только если после точки и скобок будет пробел, то делаю что мне надо с любыми символами внутри, а "окантовку" оставляю"

$test =~ s/([\s,\.\n\^\-\(\{\[])([^\s(\.\s)(\,\s)(\)\s)(\}\s)(\]\s)]+)/$1начало$2конец/g;

Не работает "до точки, но только если за ней пробел" и аналогично с запятой и не знаю, как вставить в вывод завершение окантовки, т.е. вернуть точку-пробел, ведь получается квадратная скобка внутри квадратной скобки.

спустя 22 минуты [обр] Рубероид(0/21)[досье]
Вот так вроде получается, но начало строки теперь не отследить:
$test =~ s/([\s,\.\n\^\-\(\{\[\<\>])((.*?)([,\.\)\}\]])*)(\s)/$1начало$3конец$4$5/g;
спустя 12 минут [обр] Рубероид(0/21)[досье]
Вроде, получилось:
$test =~ s/((^|[\s,:\.\n\^\-\(\{\[\<\>]))*((.*?)([,\.\)\}\]])*)(\s)/$2начало$4конец$5$6/g;
спустя 1 час 10 минут [обр] Евгений Седов aka KPbIC(38/176)[досье]
((^|[\s])) а что это за конструкция?
спустя 11 часов [обр] Рубероид(0/21)[досье]

Неа, фигня какая-то получается. Мне надо в конечном итоге выделить адреса, чтобы послать их на обработку в подпрограмму (оформить как URL, разбить на несколько, если они длинные). Варианты, предложенные в faq не подходят, т.к. во-первых выделяют все адреса без разбора (т.е. если адрес слит со словом, выделят его), и совершенно не ориентируются на концовку, а смотрят лишь, чтобы был конец слова. Обычная ситуация — когда юзер берет адрес в скобках или ставит после него точку или запятую. Эти знаки перерабатываются в URL и делают его непригодным. Ну и вариант, когда внутри GET одного адреса стоит другой адрес, ломает все.

Я хочу, чтобы начало адреса распознавалось, если он в начале строки, или же перед ним пробельный символ, или же тире, двоеточие, точка, различные скобки, но только если перед ними пробельный символ. Первую часть я решил (начало эмулировал для себя как "Ф--"):

$test =~ s/(^|\s|\n|\^|\-|\(|\{|\[|,|(\s\.)|:)(?=([http:|www\.|ftp:]))/$1Ф--$4/gi;

Вторая часть (если конец слова, конец строки, или же точка, или запятая, или закрывающие скобки, но только если после них идет пробельный символ или конец строки) не получается
(Эмулировал концовку для себя как "--Ю"):

$test =~ s/(Ф\-\-.*)(?=(([,\.\)\}\]])*(\s|$|\Z|\z))/$1--Ю$3/g;

Если бы вторая часть работала, спокойно уже мог бы выделить все что между "Ф--" и "--Ю" и послать на обработку.

спустя 19 минут [обр] Рубероид(0/21)[досье]

В первой части тоже неправильно было, надо так:

$test =~ s/(^|\s|\n|\^|\-|\(|\{|\[|,|(\s\.)|:)(?=((http:)|(www\.)|(ftp:)))/$1Ф--$4/gi;

А вообще тестирую на таком материале:

$test = qq~

www.ya1.ru <--надо

http://www.ya2.ru <--надо hhjkljlkhttp://www.ya3.ru <--не надо http://www.ya4.ru, <--надо http://www.ya5.ru. <--надо (http://www.ya6.ru) <--надо

{http://www.ya7.ru} <--надо [http://www.ya8.ru] <--надо
eererterthttp://www.ya9.ru <--не надо http://www.ya10.ru?http://www.ru.ru  <--надо 

~;
спустя 26 минут [обр] Рубероид(0/21)[досье]
Уф, с утра лучше соображается. Кажись, сделал. Теперь выдеделяет из теста выше все что нужно. Извините за "чат" на форуме:
$test =~ s/(^|\s|\n|\^|\-|\(|\{|\[|,|(\s\.)|:)(?=((http:)|(www\.)|(ftp:)))/$1Ф--/gi

$test =~ s/(Ф--)(.*?)(?=((\.|\,|\)|\}|\])*(\s|$|\Z|\z)))/$1$2--Ю/g;
Powered by POEM™ Engine Copyright © 2002-2005