Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
Posted: Wed Jul 30, 2014 11:01 am
by Infocatcher
DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)
Posted: Wed Jul 30, 2014 11:27 am
by YuS
DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Очень даже может быть, это более точное описание возможного бага.
PS Кстати, на счет lookbehind-ов...
В теме много раз уже попадалось их обсуждение и обсуждение сопутствующего ограничения для них (фиксированное число символов).
Может быть, в данной ситуации помогла бы реализация метасимвола \K ?
Этот метасимвол отрезает всё, что было до него, естественно с проверкой шаблона, и в итоговой подстроке оказывается только то, что идет после него.
Например ищем в таком тексте:
xyzg fhjabc def
шаблон:
.*[^abc]\K(abc)(?= def)
В итоговой строке получим: abc
- причем в этом случае, всё остальное окажется не захваченным. Это в регулярках coder-a было бы очень хорошим подспорьем, имхо.
Posted: Wed Jul 30, 2014 11:32 am
by YuS
Infocatcher wrote:Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)
Так чрезмерная жадность, это уже "++" должно быть, но в любом случае (a|d)+r при любой жадности, не должно спотыкаться на символах идущих после "+", ведь они не попадают в шаблон жадной группы.
Posted: Wed Jul 30, 2014 12:49 pm
by Infocatcher
YuS
Ну так то особенности реализации.
++ не реализовано, а жадность работает как-то неклассически.
Более того, я сейчас полез проверять, так на вот таком тексте
работает только «t[a-z]+?t», а «t[a-z]+t» не находит вообще ничего (я так понимаю, оно «поедает» всю последовательность, а назад, если не найдено, не возвращается). И явно больше похоже не «t[a-z]++t».
Posted: Wed Jul 30, 2014 1:54 pm
by YuS
Infocatcher wrote:
работает только «t[a-z]+?t», а «t[a-z]+t» не находит вообще ничего (я так понимаю, оно «поедает» всю последовательность, а назад, если не найдено, не возвращается). И явно больше похоже не «t[a-z]++t».
Не, в данном случае всё нормально, самая обычная жадность...
"t" попадает в диапазон "a-z" и будет им захвачено, даже при условии возврата, для поиска возможных вариантов совпадения. Но в итоге не будет найдено общего совпадения из-за отсутствия в тексте "t" (она уже захвачена жадным шаблоном "[a-z]+"), т.к. последняя "t" шаблона будет искать свое совпадение... ревнивая же квантификация, просто ускорит все проверки и не даст алгоритму возвращаться, т.е. захватывает однократно максимально возможный вариант и идет на перекур (ну, это классически).
Posted: Wed Jul 30, 2014 6:01 pm
by Skif_off
Infocatcher wrote:
DV wrote:Дело не только в "ИЛИ", а ещё и в наличии символа после "+".
Например, такой вариант работает корректно: (\()(c(a|d)+)
А как только добавляем "r" после "+", то перестаёт срабатывать на комбинации (caar, (cadr, (cdar и т.д.: (\()(c(a|d)+r)
Помнится, там чрезмерная жадность реализована, так что есть смысл попробовать (\()(c(a|d)+?r)
Кстати, \d{1,8} - не мало для захвата цифр? Число символов брал практически "с потолка"
Пусть пока остается, если что, потом добавим.
Такой еще момент. Можно ли как-то ловить по признаку "Находится внутри ближайших {...}". Просто заметил вот такую
Т.е. подсвечивается как класс, но тут этого не надо.
Posted: Thu Jul 31, 2014 12:04 am
by YuS
Cuprum wrote:
Такой еще момент. Можно ли как-то ловить по признаку "Находится внутри ближайших {...}". Просто заметил вот такую
Т.е. подсвечивается как класс, но тут этого не надо.
В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
Но с некоторыми условностями, можно попробовать обойти ограничения, как-то так:
- условности:
1. Если в строке не будет символа ";", то невалидные классы, находящиеся внутри {...}, будут подсвечены.
2. Если вне блока {...} в строке будет присутствовать ";", то валидные классы не будут подсвечены.
Кстати, по аналогии можно сделать проверку и для идентификаторов.
Posted: Thu Jul 31, 2014 10:29 am
by Cuprum
YuS wrote:
Но с некоторыми условностями, можно попробовать обойти ограничения, как-то так:
В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
Т. е. если бы было, то решило все проблемы с подсветкой?
Posted: Thu Jul 31, 2014 3:47 pm
by YuS
Cuprum wrote:
Тогда не подсвечивается класс в таком виде
В текущей реализации движка регулярок (чуть выше обозначили проблему с жадностью квантификаторов) и ограничений построчного их прохода в плагине кодера, однозначно сделать это невозможно.
Т. е. если бы было, то решило все проблемы с подсветкой?
Многострочный проход? Не факт. Он может решить некоторые проблемы, но привнести другие... тут надо выбирать меньшее из зол.
Posted: Fri Aug 01, 2014 9:15 am
by Cuprum
YuS
а можно ли как сделать, чтобы цифра не выделялась в таком правиле
css.coder 1.11
Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту
Posted: Sat Aug 02, 2014 2:36 pm
by YuS
Cuprum wrote:
Я там подкорректировал, чтобы убрать подсветку, если между числом и ед. измерения есть пробел, т.к. это не по стандарту
Так значит это где-то тут прописано?
Ага, вот вроде что-то похожее:
The format of a length value (denoted by <length> in this specification) is a <number> (with or without a decimal point) immediately followed by a unit identifier (e.g., px, em, etc.). After a zero length, the unit identifier is optional.
Ну, значит будем считать версию 1.11 релизом файла подсветки css...
ЗЫ Только \b из моего варианта лучше добавить, иначе будет подсвечиваться набор символов типа: 345emabc