- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
function coolSplit(str, pattern) {
var result = [];
while(1){
var m = str.match(pattern);
if(!m) {
if(str) result.push(str);
return result;
}
if(m.index) result.push(str.substr(0, m.index));
result.push(str.substr(m.index, m[0].length));
str = str.substr(m.index + m[0].length);
}
}
1024-- 18.09.2015 21:43 # 0
http://govnokod.ru/18688#comment297468
3_14dar 18.09.2015 22:14 # 0
Если уж на то пошло - как сматчить ^(regexp)+\+(regexp)$? Т.е. идет несколько regexp, между ними плюсы. Без re.split.
1024-- 18.09.2015 22:45 # 0
> как сматчить ^(regexp)+\+(regexp)$? Т.е. идет несколько regexp, между ними плюсы. Без re.split.
А, то есть regexp может быть фигнёй вида /<[^>]*>/ и соответствовать строке "<+>", из-за чего простой split невозможен...
В жс можно было бы
1. в цикле матчить один регексп и откусывать начало строки (как в данном ГК)
2. в цикле матчить, следя за lastIndex
3. использовать функци-анальный форич-подход с replace *:
В PHP, кажется, была функция "всё заматченное для шаблона" (по-моему, preg_match_all). Там надо было бы проверить на соответствие этому самому ^(?:(regexp)\+)+(regexp)$, а затем вызвать эту функцию с симметричным регекспом /(regexp)\+?/ - шаблон и необязательный разделитель. *
______________
* если шаблон не начинается с плюса
3_14dar 18.09.2015 23:54 # 0
Нахуй.
Регексп - str1|str2|str3. Может и + содержать.
1024-- 19.09.2015 04:09 # 0
>Нахуй.
Я же упомянул про preg_match_all. В питоне мог быть и аналог.
Вышеописанный подход на питоне:
Если у шаблона нет вореций, брать или не брать плюс в начале/конце (например, r'1\+|1' или r'\++1'), такую технику можно использовать.
1024-- 19.09.2015 04:21 # 0
Тогда наверно и ограничений нет, кроме того, что в pattern не должно быть захватывающих скобок.
(Кстати, в коде из предыдущего комментария в pattern тоже не должно их быть)
3_14dar 19.09.2015 14:23 # 0
Разбей мне в один заход 1+2+3 на \d+ разделенные "+", не сплитя по +, или выдай ошибку если формат не тот.
bormand 19.09.2015 14:28 # 0
3_14dar 19.09.2015 14:53 # 0
Да, формат строгий, при нарушении надо материться.
bormand 19.09.2015 15:30 # 0
3_14dar 19.09.2015 15:50 # +1
В чем прикол начинать модули для питона с py?
bormand 19.09.2015 15:51 # 0
3_14dar 19.09.2015 15:53 # 0
bormand 19.09.2015 15:59 # 0
Да так же как в жабе все на J...
3_14dar 19.09.2015 17:01 # 0
3_14dar 19.09.2015 15:52 # 0
Да, цифры я для примера привел, в реальности там было
>Регексп - str1|str2|str3. Может и + содержать.
bormand 19.09.2015 15:55 # 0
3_14dar 19.09.2015 15:57 # 0
bormand 19.09.2015 16:03 # 0
Т.е. можно искать фрагменты внутри хтмл и.т.п.
3_14dar 19.09.2015 17:02 # 0
bormand 19.09.2015 17:50 # 0
А вообще - все эти парсеры намного сильнее регулярок. Рекурсивную херню типа XML или выражений со скобочками они запросто сожрут и не подавятся.
3_14dar 19.09.2015 18:32 # 0
Если он входит в возможное слово - то не разделитель. См. здесь http://govnokod.ru/18737#comment298410
>А вообще - все эти парсеры намного сильнее регулярок.
Да я понял уже. Но у меня ситуация вполне конкретная.
А вообще интересно было бы увидеть парсер конфигов на нем. Где-то я что-то похожее видел, в pyload, кажется.
bormand 19.09.2015 19:17 # 0
Что-то типа такого нужно? http://ideone.com/RKaR6K
3_14dar 19.09.2015 19:26 # 0
bormand 19.09.2015 19:29 # +1
Ну с константами даже проще...
http://ideone.com/5E5v2p
3_14dar 19.09.2015 19:54 # 0
bormand 19.09.2015 21:16 # 0
3_14dar 19.09.2015 21:29 # 0
bormand 19.09.2015 21:47 # 0
Ну и можно делать парсеры для фрагментов, комбинировать их в бОльшие, реюзать, делать рекурсию и т.п. С регулярками такое не катит.
1024-- 19.09.2015 19:32 # 0
Юзаем регулярки для задач, для которых они не предназначены с 60х годов и гордимся этим!
Но ведь функции для всего, что мы делаем, есть!
Проверить на (A\+)+A мы можем. Одновременно проверить и заматчить A в A\+A мы можем. Почему бы одновременно не проверить и заматчить все A в (A\+)+A, не притягивая более серьёзные инструменты?
3_14dar 19.09.2015 19:55 # 0
bormand 20.09.2015 09:49 # 0
Ну или юзать унылый цикл с откусыванием по кусочку или по результатам split()/findall().
3_14dar 20.09.2015 12:23 # 0
> скобки в re не умеют
Он же вроде PCRE совместимый?
1024-- 20.09.2015 12:27 # 0
Уже было в http://govnokod.ru/18737#comment298410
3_14dar 20.09.2015 12:38 # 0
1024-- 20.09.2015 12:54 # 0
3_14dar 20.09.2015 13:32 # 0
Говно. sum(map(len, found)) + len(found) -1 же. Или len("".join(found)) + len(found) -1. Но все равно дополнительная проверка.
Короче я решил так.
Дальше проверяем чтобы список состоял из пустых строк и +, или если строже - '' в начале и конце, остальное + (что-то в твоем коде не то)
1024-- 20.09.2015 19:14 # 0
Сам такой!
> Дальше проверяем чтобы список состоял из пустых строк и +
Если просить заматчить ещё и разделитель вместе со строкой, в предложенном мной случае /1\+|1/ и '1++1+1+' оно не съест лишний раз "1+" (что и произошло в коде выше), когда этот плюс будет разделителем.
Тогда в моём случае будет
И список всегда будет состоять только из пустых строк.
3_14dar 20.09.2015 21:28 # 0
Но зачем? Он же разделитель.
>Сам такой!
Ну сам смотри.
>'' в начале и конце, остальное +
У меня такого не было тк + был внутри, так что я об этом как-то не задумывался.
1024-- 20.09.2015 22:01 # 0
> У меня такого не было
Вот ради таких случаев, когда разделитель на краю строки.
Ну и ради равномерности: ['', '', '', ''] против ['', '+', '+', '']
И ради равномерности регулярки для всей строки: ^(A\+)+$ вместо ^A(\+A)*$. С этого-то всё и началось.
bormand 20.09.2015 12:41 # 0
Ну я представлял это как вызвать findall и в цикле проверить, что все найденные куски лежат друг за другом (разделитель бы захватывался в конце кусков). Но хуёвый вариант, да.
Откусывание по одному фрагменту проще всего смотрится из всего этого говна.
> Он же вроде PCRE совместимый?
Хер знает, если честно. Я особо не заморачивался. Сам потестил - скобка с плюсом после неё захватывает только последний кусок (матчит само собой всё - group(0) == "1+2+3+4", но захватывает только последний: group(1) == "3+"). Посмотрел на stackoverflow - народ жалуется, что захватывается только последний и предлагает юзать regex вместо re. В спеке как всегда о таких тонкостях умалчивается (питон стайл, хули). Вот и всё что мне известно по этой проблеме.
3_14dar 20.09.2015 13:28 # 0
bormand 20.09.2015 13:51 # 0
All engines return the last value captured. For instance, if you match the string A_B_C_D_ with ([A-Z]_)+, when you inspect the match, Group 1 will be D_.
Ну т.е. как в питоне. За исключением движков, которые умеют массивы в группах возвращать (например, тот самый regex, о котором я писал выше).
3_14dar 20.09.2015 16:45 # 0