LINUX.ORG.RU

Как правильно написать регулярку

 


0

1

Задача: нужно разрешить вводить печатные символы, между которыми может быть только один пробел, строка может содержапть от 3 до 255 символов.

Как делаю это я:

/^(?=.{3,255}$)(\S ?)*\S$/.test('Mr. Madison')

Есть ли способы красивее?

★★

Perl regex - это не регулярное выражение. Твоя задача не решается регулярной грамматикой. Точнее так: решается для конкретных чисел 255 и 3, но тебе придется написать объедиение (255-3) регулярных выражений.

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

anonymous
()
Ответ на: комментарий от anonymous

Perl regex - это не регулярное выражение. Твоя задача не решается регулярной грамматикой.

Ну как бы регулярные выражения в программировании и в теории фолрмальных грамматик - это разные вещи.

annulen ★★★★★
()
Ответ на: комментарий от annulen

регулярные выражения в программировании

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

Нет уж, я лучше буду придерживаться формальных грамматик

anonymous
()

\w\s\w и чек длинны в коде, ИМХО

anonymous
()
Ответ на: комментарий от anonymous

Ограничение на минимум 3 символа слишком тяжелое, короче будет вытащить (если я ничего не напутал)

/^\S+( \S+)*(\S| )(\S+ )*\S+$/

против

length >= 3 and /\S+( \S+)*/
anonymous
()
Ответ на: комментарий от next_time

simplify

Под этим может подразумеваться что угодно, и в разных средах называться как угодно. Ты ничего не доказал, а лишь показал личное местечковое предпочтение, которое даже не гуглится. В отличие от «split string by whitespace». Грустно наверное быть таким обособленным?

anonymous
()
Ответ на: комментарий от anonymous

типа \s в зависимости от диалекта (перл, греп, глоб - тысячи их) и среды всегда одинаково отработает, ещё небось с юникодовскими пробелами будет затык в большинстве сред

next_time ★★★★★
()
Ответ на: комментарий от next_time

Их тысячи, только если включать в набор все подряд. Ирл диалектов, отличия в которых сможет найти обычноюзер - всего три: bre, ere и pcre. Bre удобен при работе с конкретным текстом (редактор/поиск), так как эскейпятся почти все спецсимволы, а текст пишется как есть. Ere наоборот - для использования в скриптах и программах, которым конкретный текст сам по себе неинтересен. Pcre не регулярен, но и задачи нерегулярны, потому он наследует ere. В языках именно он, с вероятностью, близкой к 1.

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

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

anonymous
()
Ответ на: комментарий от anonymous

Так что не будем об уникоде.

во-во, вся суть регулярок

next_time ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.