как записать regexp паттерн

oyuriyu

Никак не могу записать нормально такой паттерн, постоянно контр-примеры вылазят, на которых он не работает. Как это можно сделать нормально ?
Ищется строка такого вида
\s*(слово на русском языке) (разделитель из пробела или других символов типа -, :, — , с обоих сторон ещё и пробелы могут бытьслово на русском языке : (двоеточие возможно окружённое пробелами, может просто пробелы без : цифра, а потом всё что угодно)

Helga87

Возможно
\s*[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+\s*[\-:—]\s*[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+\s*[:]?\s*\d.*

вместо перечисления русского алфавита можно сделать через указание интервалов кодов в юникоде, но мне лень искать какие там коды. Плюс, в этом примере надо запускать с флагом CaseInsensitive
и посмотри - работает ли движок, который ты используешь на
ля-ля 5

если нет, то самое простое - сделать два регекспа. Один на случай, если двоеточие перед цифрой есть, второй - если нет

oyuriyu

[:]?
А почему не просто :?

katrin2201

полагаю, что
( : (двоеточие возможно окружённое пробелами, может просто пробелы без : )

pitrik2

у меня обычно работают русские буквы так: а-яё
\s можно включать в []
вот эта фраза не совсем ясна:
разделитель из пробела или других символов типа -, :, — , с обоих сторон ещё и пробелы могут быть
имеется ввиду вперемежку пробелы и знаки?
или если несоклько знаков то пробелы между ними нельзя?
короче, вот это нормально? " :- :- " или должно быть только " :-:- "?

\s*[А-Яа-яЁё]+[\s-:—]*[А-Яа-яЁё]+\s*:?\s*\d.*

почему [:]? я кстати тоже не понял
что ответил тем более не понял

nikita270601

Либо ответил правильно на вопрос «А почему не просто :?», либо вопрос «А почему не просто :??» был сформулирован грамматически неверно — без вопросительного знака в конце. :)
Кстати, тоже не понял, зачем писать [:]?, если можно написать :?.

durka82

Есть такая прога - RegexBuddy .
Там есть такая прикольная штука как отображение регэкспов в токенах.
Еще не понял, насколько это полезно, но вполне может помочь лучше разобраться в регэкспе.

pitrik2

+1
тоже ею пользуюсь :)
правда редко, обычно сходу пишу

durka82

Для языков, у которых не предусмотрено создание библиотек регэкспов (тот же .нет такие библиотеки можно делать в этот проге (вроде там это можно делать, там есть встроенная библиотека, только начал с ней разбираться) :)

kruzer25

Кстати, тоже не понял, зачем писать [:]?, если можно написать :?.
+1.
Только, вроде бы, всё-таки \:?

nikita270601

У меня работает :?.
Python, модуль re.

pitrik2

\:?
в регэкспах экранируются "команды"
: - это какая команда?

kruzer25

The fact that plain parentheses fulfil two functions is not always helpful. There are often times when a grouping subpattern is required without a capturing requirement. If an opening parenthesis is followed by "?:", the subpattern does not do any capturing, and is not counted when computing the number of any subsequent capturing subpatterns. For example, if the string "the white queen" is matched against the pattern the ?:red|white) (king|queen the captured substrings are "white queen" and "queen", and are numbered 1 and 2. The maximum number of captured substrings is 99, and the maximum number of all subpatterns, both capturing and non-capturing, is 200.
As a convenient shorthand, if any option settings are required at the start of a non-capturing subpattern, the option letters may appear between the "?" and the ":".
Т.е., у двоеточия есть и специальное значение.
Так что, лучше, во избежание неприятностей, всё-таки заэкранировать.

kruzer25

Например.
Ты что, экономишь на бэкслэшах?

pitrik2

Ты что, экономишь на бэкслэшах?
они ухудшают читаемость

kruzer25

Наоборот. Если видишь \: - то сразу понятно, тут имеется в виду именно символ ":". А если видишь : - то имеется в виду что угодно, вплоть до того, что автор регэкспа мог забыть написать ? после скобки.
(a?i:qwe) - вот что он имел в виду, почему его функция (в которой этот регэксп) возвращает неправильный ответ?
А если (a?i\:qwe) - то всё понятно, никаких вариантов.

kruzer25

Тогда уж не букву P, а угловые скобки.
Которые, кстати, ещё и в assertions используются.

kruzer25

Не вижу смысла писать их куда попало.
А ещё я, например, всегда, если хочу написать в строке бэкслеш (пусть даже это php-шная строка в одиночных кавычках) - экранирую его, вне зависимости от того, что там написано после этого бэкслеша.
Это плохо?

kruzer25

Для альтернативно одарённых - представь, что тебе надо разбираться в чужой функции. Она почему-то возвращает неверный результат. В ней - вот такой регэксп. Если ':' экранирована - то сразу понятно, что имелось в виду. А если не экранирована - то остаётся простор аж для трёх опечаток.
Конечно, если тебе насрать, насколько читаем твой код, и насрать на тех, кто будет в нём разбираться - твоё дело. Я рад, что я не работаю с тобой.

tipnote

Жжошь плазмой! :D

ava3443

Жжошь плазмой!
жжот, да! :D

oyuriyu

Есть такая прога - RegexBuddy .
Там есть такая прикольная штука как отображение регэкспов в токенах.
Еще не понял, насколько это полезно, но вполне может помочь лучше разобраться в регэкспе.
А под линух такое есть ?

durka82

А под линух такое есть ?

Его нет, насчет подобного - не знаю.
Одно скажу - чем больше я знакомлюсь с RegexBuddy, тем меньше мне он нравится :(
Единственное, для чего он действительно неплох - обучение.
В общем я разочаровался и начал писать свой вариант :grin:
Оставить комментарий
Имя или ник:
Комментарий: