правило
.»с»\»
“.”Точка, любой символ в регулярном выражении.“\”В регулярном выражении естьПобег персонажКогда нам нужно описать специальный символ, который использовался регулярными выражениями, мы можем преобразовать его в его первоначальное значение, используя «\».
«\» Также есть некоторые в регулярных выраженияхПредопределенный специальный контент:
символ | описание |
---|---|
\d | Представляет любое число |
\w | Представляет любой символ слова (только цифры, буквы, подчеркивания) |
\s | Представляет любой пустой символ (\ t \ r \ n \ f \ x0B) |
\D | Представляет любой нечисловой символ |
\W | Представляет любой несловесный символ |
\S | Представляет любой непустой символ |
Набор символов []
“[]”Используется дляЧтобы описать отдельный символ, содержимое символа может быть определено в квадратных скобках или может быть описан диапазон.
пример
символ | описание |
---|---|
Указывает, что персонаж может быть только a или b или c | |
Указывает, что символ может быть только 1 или 2 или 3 | |
Указывает, что символ может быть любой строчной буквой. | |
Чтобы указать, что символ может быть любым числом |
Выберите из нескольких диапазонов
Указывает, что символом может быть любая буква, цифра и знак подчеркивания.
“*”、”+”、”?”
Обычно в строке, которую мы должны описать, будет много элементов, которые появляются неоднократно, но нам не нужно строго ограничивать количество вхождений, мы можем использовать квантификатор «*», «+» Например: адрес электронной почты, затем несколько символов могут отображаться в качестве имени пользователя перед символом «@». В настоящее время мы можем использовать «\ w +», чтобы описать, что здесь появляется хотя бы один символ слова.
символ | описание |
---|---|
“+” | Указывает, что контент может появляться как минимум один раз подряд |
“*” | Указывает, что содержимое появляется 0-несколько раз |
“?” | Значит содержание появляется 0-1 раз |
{n}、{n,}{n,m}
В дополнение к упомянутым ранее квантификаторам, иногда нам также нужны особые требования для количества показов контента.
Например, номер мобильного телефона. В настоящее время номер, который мы хотим отобразить, не может быть расплывчатым понятием, но должен содержать 11 цифр. Другой пример — когда мы просим пользователя ввести пароль, пароль должен быть 6-15 цифрами. При возникновении такой проблемы мы можем использовать:
символ | описание |
---|---|
{n} | Указывает, что контент должен появляться n раз |
{n,m} | Указывает, что контент появляется n-м раз |
{n,} | Указывает, что контент появляется не менее n раз |
Например, \ d {11} означает, что число может содержать только 11 цифр, что решает вышеуказанную проблему.
Группа «()», «|»
() Можно рассматривать как единое целое, (|) можно использовать для обозначения или связи.
Посредством вышеупомянутого содержания мы не можем решить проблему, подобную следующей:
При описании номера телефона перед ним стоит код города, формат которого может быть 0086 или +86. Как же выбрать между этими двумя строками?
В это время мы можем использовать группировку «()». Например
«^» И «$»
Добавляя «^» в начале регулярного выражения и добавляя «$» в конце, чтобы указать целое. Если они не используются, то регулярное выражение только соответствует тому, соответствует ли часть строки правилам формата, но для их использования необходимо, чтобы строка соответствовала правилам форматирования от начала до конца , Например
Метасимволы регулярных выражений
Подстановочные знаки
. | Соответствует любому символу, но только одному (букве, цифре или символу). | 1. соответствует 10, 1A 1.1 соответствует 111, 1A1Примеры |
? | Означает, что предшествующий символ может присутствовать или отсутствовать в строке. | 10? соответствует 1, 10Примеры |
+ | Означает, что предшествующий символ присутствует и может повторяться несколько раз. | 10+ соответствует 10, 100Примеры |
* | Означает, что предшествующий символ может отсутствовать, присутствовать или повторяться несколько раз. | 1* соответствует 1, 10Примеры |
| | Логический оператор ИЛИ. Не используйте этот символ в конце регулярного выражения. |
1|10 соответствует 1, 10Примеры |
Обозначение позиции в поле
^ | Означает, что соседние символы находятся в начале строки. | ^10 соответствует10, 100, 10x ^10 не соответствует 110, 110xПримеры |
$ | Означает, что соседние символы находятся в конце строки. | 10$ соответствует 110, 1010 10$ не соответствует100, 10xПримеры |
Группы
( ) | Означает, что заключенные в скобки символы присутствуют в указанном порядке в любом месте строки. Также используется для группировки других выражений. |
(10) соответствует10, 101, 1011 (|) соответствует любой цифре или строчной буквеПримеры |
Означает, что заключенные в скобки символы присутствуют в любом порядке в любом месте строки. | соответствует012, 120, 210Примеры | |
— | Означает, что любой символ из заключенного в квадратные скобки диапазона может присутствовать в любом месте строки. | соответствует любой цифре от 0 до 9Примеры |
Экранирование
\ | Означает, что соседний символ нужно интерпретировать буквально, а не как метасимвол регулярного выражения. | \. означает, что точку нужно интерпретировать как пунктуационную точку или десятичный знак, а не как подстановочный знак. 216\.239\.32\.34 соответствует 216.239.32.34Примеры |
Группирование
Мы можем сгруппировать несколько символов в нашем регулярном выражении, используя круглые скобки . Затем мы можем выполнить разные действия с этой группой символов (например, добавить мультипликаторы).
Допустим, нам нужно узнать, упоминается ли какой-то конкретный человек. Его могут звать John Reginald Smith, но второе имя может присутствовать, а может и нет:
Совет: Обратите внимание на пробелы в регулярном выражении, приведенном выше
Важно помнить, что они являются частью вашего регулярного выражения, и вы должны убедиться, что они находятся в нужных местах
Вышеприведенный совет является очень важным, он указывает на распространенный источник проблем, возникающих при использовании регулярных выражений новичками. Например:
Вы не ограничены только обычными символами в скобках. Вы можете использовать в скобках и метасимволы (включая мультипликаторы).
Например, нам нужно найти экземпляры IP-адресов. IP-адрес представляет собой набор из 4 чисел (от 0 до 255), разделенных точками (например, ):
Это уже немного сложнее, поэтому давайте разберемся детально:
обозначает границу слова;
здесь мы разбили IP-адрес на 3 части, состоящие из чисел от 0 до 255 + точки + последнее (4-е) число от 0 до 255;
в скобках мы обрабатываем первые 3 части IP-адреса: указывает на то, что мы ищем от 1 до 3 цифр + точку, следующую за этими цифрами, которую мы не забываем экранировать (). Мы ищем ровно 3 таких последовательности, поэтому указываем мультипликатор сразу за скобками;
наконец, мы ищем 4-е число, указывая , и обозначаем конечную границу слова ().
Опережающие и ретроспективные проверки — (?=) and (?
d(?=r) соответствует d, только если после этого следует r, но r не будет входить в соответствие выражения -> тест(?<=r)d соответствует d, только если перед этим есть r, но r не будет входить в соответствие выражения -> тест
Вы можете использовать оператор отрицания !
d(?!r) соответствует d, только если после этого нет r, но r не будет входить в соответствие выражения -> тест(?<!r)d соответствует d, только если перед этим нет r, но r не будет входить в соответствие выражения -> тест
Заключение
Как вы могли убедиться, области применения регулярных выражений разнообразны. Я уверен, что вы сталкивались с похожими задачами в своей работе (хотя бы с одной из них), например такими:
- Валидация данных (например, правильно ли заполнена строка time)
- Сбор данных (особенно веб-скрапинг, поиск страниц, содержащих определённый набор слов в определённом порядке)
- Обработка данных (преобразование сырых данных в нужный формат)
- Парсинг (например, достать все GET параметры из URL или текст внутри скобок)
- Замена строк (даже во время написания кода в IDE, можно, например преобразовать Java или C# класс в соответствующий JSON объект, заменить “;” на “,”, изменить размер букв, избегать объявление типа и т.д.)
- Подсветка синтаксиса, переименование файла, анализ пакетов и многие другие задачи, где нужно работать со строками (где данные не должны быть текстовыми).
Перевод статьи Jonny Fox: Regex tutorial — A quick cheatsheet by examples
Синтаксис регулярных выражений
Большинство символов в регулярных выражениях представляют сами себя, за исключением группы специальных символов « \ / ^ $ . | ? * + ( ) { }». Если эти символы нужно представить в качестве символов текста, их следует экранировать обратной косой чертой «\».
Если эти спецсимволы встречаются без обратной косой черты, значит у них особенные значения в регулярных выражениях:
- «^» — каретка, циркумфлекс или просто галочка. Начало строки;
- «$» — знак доллара. Конец строки;
- «.» — точка. Любой символ;
- «*» – знак умножения, звездочка. Любое количество предыдущих символов;
- «+» – плюс. 1 или более предыдущих символов;
- «?» – вопросительный знак. 0 или 1 предыдущих символов;
- «( )» – круглые скобки. Группировка конструкций;
- «|» – вертикальная линия. Оператор «ИЛИ»;
- «» – квадратные скобки. Любой из перечисленных символов, диапазон. Если первый символ в этой конструкции – «^», то массив работает наоборот – проверяемый символ не должен совпадать с тем, что перечислено в скобках;
- «{ }» – фигурные скобки. Повторение символа несколько раз;
- «\» – обратный слеш. Экранирование служебных символов.
Также существуют специальные метасимволы, ими можно заменить некоторые готовые конструкции:
- \b — обозначает не символ, а границу между символами;
- \d — цифровой символ;
- \D — нецифровой символ;
- \s — пробельный символ;
- \S — непробельный символ;
- \w — буквенный или цифровой символ или знак подчеркивания;
- \W — любой символ, кроме буквенного или цифрового символа или знака подчеркивания.
API, связанный с регуляризацией в Java
метод совпадений
matches()Параметры метода требуют, чтобы мы передали регулярное выражение, описываемое строкой, а затем использовали регулярное выражение Правила форматирования строки, описываемые выражением, соответствуют текущей строке. Если она удовлетворена, метод возвращает значение true. В противном случае вернуть false。
сплит метод
String[] split(String regex)Параметр: требует, чтобы регулярное выражение, описываемое строкой, передавалось, а затем правила строки, описываемые регулярным выражением, используются для соответствия текущей строке, и строка разделяется в соответствии с удовлетворенной частью.
метод replaceAll
String replaceAll(String regex,String replacement): Параметр требует регулярного выражения, описываемого строкой и строкой, для замены, а затем использует строковые правила, описанные регулярным выражением, для соответствия текущей строке, и заменяет удовлетворенную часть той, которую необходимо заменить. Строка.
Чередование и оператор ИЛИ
При чередовании мы имеем возможность искать что-либо из указанного нами списка. Мы видели очень простой пример чередования с использованием оператора диапазона. Это позволяет нам выполнить поиск одного символа, но иногда нам может быть нужно выполнить операцию и с большим набором символов. Это делается с помощью оператора ИЛИ (). Например, нам нужно найти все экземпляры или :
Мы также можем использовать несколько операторов ИЛИ для нахождения большего количества вариантов:
Иногда нам может быть нужно, чтобы чередование происходило только с частью регулярного выражения. Для этого используются круглые скобки:
12 ответов
Лучший ответ
Я бы рекомендовал использовать для этого Datejs. Парсинг даты самостоятельно не требуется, а регулярных выражений недостаточно для проверки метки времени. С datejs вы можете проанализировать строку в дате, и вы получите null, если она недействительна:
17
Joey
29 Июн 2009 в 14:28
Стиль perl: \ d {3} / \ d / \ d \ d (? :: \ d) {2}
1
Nikolai Ruhe
29 Июн 2009 в 11:04
Для действительной даты между 1000 и 2999 годами используйте:
Месяцы могут варьироваться от 01 до 12, дни от 01 до 31 и время от 00:00:00 до 23:59:59.
2
riroo
8 Июл 2014 в 09:47
Это регулярное выражение, которое вы ищете:
Mehmet nuri
7 Ноя 2019 в 12:40
Если вы просто хотите проверить синтаксис, вот регулярное выражение POSIX:
Но если вы хотите проверить семантику, я бы обработал строку, используя ваш язык по вашему выбору, слишком много случаев, которые вы не можете охватить с помощью регулярных выражений (например, високосные годы / секунды, летнее время и т. Д.)
6
soulmerge
29 Июн 2009 в 11:48
Вам следует подумать не делать это с регулярными выражениями, а просто запустить строку через DateTime с правильной строкой формата. Таким образом, вы можете убедиться, что это действительно действительная временная метка, а не просто нечто, похожее на это.
6
Joey
29 Июн 2009 в 11:06
2
James
29 Июн 2009 в 11:34
Вот как я создаю регулярное выражение, точно совпадающее с отметкой времени SQL в диапазоне
Примечание: я избегал 2038 года, чтобы иметь на один крайний случай меньше. Максимально возможная временная метка SQL — .
2
Jonasjso
10 Окт 2019 в 13:39
Regular-Expressions.info — хороший источник информации о RegEx, у него также есть хороший учебник.
1
RuudKok
29 Июн 2009 в 11:04
Проверьте, пожалуйста
1
AndroCoder
22 Дек 2017 в 17:47
Я только что написал Regex для управления датой и временем MySQL (и я думаю, что для Oracle или другого сервера баз данных он не так уж отличается).
Этот ReGex очень безопасен и контролирует срок действия даты (месяцы через 28, 30 и 31 день и даже годы с 29/02). Затем он контролирует время. Формат отметки времени следующий:
Вот регулярное выражение (довольно длинное):
Спички
Non- Спички
Я не думаю, что смогу сделать более защищенным. Очень функционален и проверен. Пожалуйста, если вы используете его, не стесняйтесь дать мне отзыв;)
К вашему сведению: если вы просто ищете элемент управления Regex без времени, перейдите туда, чтобы найти его: (проверьте мой пост).
Ура
4
3 revs
23 Май 2017 в 11:59
С помощью
Может проверить синтаксис, но, как указывает Бальфа, это не делает его действительной датой.
1
CoverosGene
29 Июн 2009 в 11:04
Пять способов протестировать свои знания о регулярных выражениях
При изучении регулярных выражений очень важна практика. Чем больше практикуешься, тем быстрее начинаешь строить нужные конструкции и решать поставленные задачи.
1. Изучаем регулярные выражения в текстовом редакторе
Почти всем новичкам я сразу рекомендую ставить текстовый редактор NotePad++ и начинать тренироваться в нём. Почему именно в этом текстовом редакторе:
- в большинстве случаев спецсимволы не нужно экранировать;
- Notepad++ сохраняет конструкции предыдущих запросов;
- функция «Пометки» наглядно показывает результат поиска по заданной конструкции и позволяет быстро внести правки:
2. Проверяем знания регулярных выражений в Regex
Онлайн-сервис regex101.com позволяет ввести набор данных и регулярное выражение. После этого в наборе данных подсветятся строки, соответствующие выражению. В специальном окне Explanation регулярное выражение разбирается по частям:
Давайте потренируемся: задача — подсветить всю строку полностью. Нужно поставить галочку напротив «multi line».
Тестовые данные:
Регулярные выражения для проверки знаний:
- выбрать все страницы;
- выбрать все страницы с https;
- все страницы на украинском языке;
- все индексные страницы;
- все карточки товаров (для русской и украинской версий);
3. Тестируем регулярные выражения с помощью Jsfiddle
Jsfiddle — инструмент для экспериментов с JavaScript. В нем можно проверить условия для запуска функции или демонстрации нужных результатов.
В этом примере видно, как на основании регулярных выражений сначала определяется, является ли нажатый элемент ссылкой на файл .pdf или .jpg. После этого для элементов, которые не являются ссылками на файлы, определяются название и цена товара. Все это выясняется, исходя из текстового содержимого элементов.
4. Проверяем ошибки в регулярных выражениях с помощью Google Analytics
Самый быстрый способ проверить знания о регулярных выражениях в Google Analytics — фильтры в стандартных отчетах. Зайдите в свой аккаунт и в любом отчете, где доступны фильтры, попробуйте отобрать какой-либо набор данных.
Обратные ссылки
Всякий раз, когда мы сопоставляем что-либо в круглых скобках, это значение фактически сохраняется в переменной, к которой мы можем обратиться позже в регулярном выражении. Для доступа к этой переменной мы используем escape-символ (), за которым следует цифра. Первый набор скобок обозначается как , второй — и т.д.
Допустим, нам нужно найти строки с двумя упоминаниями о человеке с фамилией Smith. При этом, мы не знаем его имени. Мы могли бы сделать следующее:
В этом примере мы сопоставляем текст между двумя экземплярами Джона Смита, но в этом случае, это нормально, поскольку мы не слишком обеспокоены тем, что было сопоставлено, нам важно только наличие совпадения
4 ответа
Лучший ответ
Это указывает на то, что подшаблон не является подшаблоном. Это означает, что все, что соответствует в , даже если оно заключено в , оно не будет отображаться в списке совпадений, будет только .
Вы все еще ищете определенный шаблон (в данном случае один пробельный символ, следующий хотя бы за одно слово), но вам все равно, что на самом деле соответствует.
42
BoltClock
14 Сен 2010 в 03:12
Давайте разберемся на примере
Простыми словами мы можем сказать, давайте, например, мне дали строку say (s = «a eeee»).
Ваше регулярное выражение ( / ^ (?: \ W + \ s) (\ w +) $ / .) В основном будет работать в этом случае, оно будет начинаться с найденной строки ‘a’ в начале строки и обратите внимание, что здесь есть «пробел»), который в данном случае, если вы не включите?: вернул бы «a» (с пробелом). Если вам может не нужен этот тип ответа, поэтому вы включили его как * (?: \ W + \ s) *, он вернет вам просто a без пробелов т.е
.’a ‘(который в этом case?: выполняет это соответствие со строкой, но исключает все, что идет после, это означает, что он будет соответствовать строке, но не пробелам (с учетом совпадения (числа или строки), а не дополнительных вещей с ними. )
Если вам может не нужен этот тип ответа, поэтому вы включили его как * (?: \ W + \ s) *, он вернет вам просто a без пробелов т.е. .’a ‘(который в этом case?: выполняет это соответствие со строкой, но исключает все, что идет после, это означает, что он будет соответствовать строке, но не пробелам (с учетом совпадения (числа или строки), а не дополнительных вещей с ними. )
PS: Я новичок в регулярных выражениях. Это то, что я понял с помощью?:. Не стесняйтесь определять неправильные объяснения.
Yatin arora
29 Апр 2021 в 15:04
Помимо предоставленных отличных ответов, его полезность также заключается в упрощении кода, необходимого для извлечения групп из сопоставленных результатов. Например, ваша группа известна как группа 1, и вам не нужно беспокоиться о каких-либо группах, которые появляются перед ней. Это может улучшить ремонтопригодность вашего кода.
7
Ardent Coder
14 Июн 2020 в 18:26
Это означает только группу , но вы не запомните сгруппированную часть.
По умолчанию указывает механизму регулярных выражений запомнить часть строки, которая соответствует образцу между ней. Но иногда мы просто хотим сгруппировать шаблон без запуска памяти регулярных выражений, для этого мы используем вместо
8
codaddict
14 Сен 2010 в 03:13
Ретроспективная проверка
Ретроспективные проверки работают так же, как и опережающие проверки, но вместо того, чтобы смотреть вперед, а затем отбрасывать или использовать результат, мы смотрим назад и затем отбрасываем или используем результат. Подобно опережающим проверкам, ретроспективные проверки также могут быть как позитивными, так и негативными. Они используют аналогичный синтаксис, но с добавлением после .
Синтаксис позитивной ретроспективной проверки:
Синтаксис негативной ретроспективной проверки:
Допустим, нам нужно найти экземпляры, соответствующие слову , но только если это фамилия. Чтобы сделать это, мы указываем, что хотим проверить слово перед найденным значением , и, если это слово начинается с заглавной буквы, мы будем считать фамилией:
Поначалу разобраться с опережающими и ретроспективными проверками может быть немного сложно, но это всего лишь дело практики.
Регулярные выражения для времени
-
ЧЧ: ММ 12-часовой формат, необязательный ведущий 0
-
ЧЧ: 12-часовой формат ММ, необязательный ведущий 0, обязательные меридиемы (AM / PM)
-
ЧЧ: ММ 24 часа с 0 в начале
-
ЧЧ: ММ 24-часовой формат, необязательный ведущий 0
-
ЧЧ: ММ: СС 24-часовой формат с 0 в начале
Справка и демонстрация
- 4 Спасибо! Этот ответ должен быть вверху.
- Любая причина ЧЧ: ММ 24 часа с 0 в начале это не ?
- Потому что регулярное выражение в ответе работает хорошо. И тот, который вы прокомментировали, тоже работает. Не стесняйтесь использовать любой из них.
- Для людей, сопоставляющих 12-часовые (с am / pm) строки с указанным выше регулярным выражением, имейте в виду, что проверка «13:00 PM» по регулярному выражению вернет true (некоторые значения), потому что часть «15:00 PM» в строке действительный. Я решил проблему, используя следующий оператор if let res = value.match (regex); если (res && res [0] === значение) doSomething ();
У меня ничего из вышеперечисленного не сработало. В итоге я использовал:
Логика:
Первое число (часы): число от 0 до 19 -> (допускается однозначное число) или число от 20 до 23 ->
второе число (минуты) всегда представляет собой число от 00 до 59 -> (не допускается использование одной цифры)
- 8 Вам не нужно тире в первой квадратной скобке, тоже работает;)
- 3 Вот этот ответ изменен, чтобы принимать только 12-часовое время (включая необязательные ведущие нули):
- , чтобы установить начальный ноль
Вы можете использовать это 24 часа, секунды не являются обязательными
Лучше всего было бы ЧЧ: ММ без всякого риска.
можно ли сократить до ?
Удивительно, но я обнаружил, что на самом деле все это не совсем покрывает это, поскольку они не работают для более короткого формата полуночи 0: 0, а некоторые не работают и для 00:00, я использовал и протестировал следующее:
Вы можете использовать это регулярное выражение:
Если вы хотите исключить 00:00, вы можете использовать это выражение
Второе выражение — лучший вариант, потому что допустимое время — от 00:01 до 00:59 или с 0:01 до 23:59. Вы можете использовать любой из них по своему усмотрению. Regex101 ссылка
Первое выражение не принимает 00: 05 . Но спасибо. Приводит меня к проверке, которую я искал.
Совпадения:
2:9 2:09 2:59 02:9 02:09 02:59 23:59
Используй это:
- какое время 2: 9 или 02: 9?
- например, в C # существует множество вариантов преобразования объекта DateTime в строку. . Для получения дополнительной информации см. Ссылку
Как вы просили, крайний левый бит необязательный, я также сделал крайний левый и крайний правый бит необязательными, проверьте это
Он совпадает с
Живая ссылка доступна здесь
Вы можете использовать следующее регулярное выражение:
Объявить
Этот метод возвращает значение «истина», когда строка соответствует регулярному выражению.
Небольшая модификация приведенного выше вклада Маниша М. Демблани касается 4 утра (я избавился от секции секунд, поскольку она мне не нужна в моем приложении)
обрабатывает: 4:00 4:00 4:00 4:00 4:00 4:30 и т. д.
1 =
Приведенное ниже регулярное выражение поможет проверить формат чч: мм.
Мой:
Это намного короче
Протестировано на нескольких примерах
Соответствие:
- 00:00
- 7:43
- 07:43
- 19:00
- 18:23
И не соответствует ни одному недопустимому экземпляру, например 25:76 и т. Д.
- не совпадают
- Ваши собственные примеры 00:00 и 07:43 не совпадают.
Вы можете попробовать следующее
Он может обнаруживать следующие закономерности:
проверьте это мастерское регулярное выражение детектора временных меток, которое я построил, чтобы искать указанную пользователем метку времени, примеры того, что она будет собирать, включают, но определенно НЕ ограничиваются;
Он также может набрать намного больше, если время включает цифры
1 … Я даже не вижу …: — /
Попробуйте следующее
Примечание: я предполагал, что движок регулярных выражений javascript. Если что-то не так, дайте мне знать.
Вы можете использовать следующее регулярное выражение:
Единственное изменение, которое я сделал — крайняя левая цифра является необязательной. Остальная часть регулярного выражения такая же.
6 ответов
Лучший ответ
Вы можете немного упростить его так:
Синтаксис — это группа без захвата, которая, как я считаю, должна повысить производительность, когда вам не нужны группы как таковые.
Тогда хитрость заключается в следующем утверждении:
Благодаря каретке, это будет соответствовать началу строки или одному или нескольким символам пробела.
ОБНОВЛЕНИЕ: Это отлично работает в моем тестировании, и там, конечно, меньше избыточного кода. Однако я просто использовал бенчмаркинг в Regex Hero, чтобы обнаружите, что ваше оригинальное регулярное выражение на самом деле быстрее. Это, вероятно, потому, что мое вызывает повторное отслеживание.
ОБНОВЛЕНИЕ № 2: я нашел другой способ, который выполняет то же самое, я думаю:
Я понял, что слишком стараюсь. соответствует 0 или более пробелам, что означает, что он будет работать для одного тега. Но … это будет работать и для 2-5 тегов, потому что пробел не в вашем классе символов . И действительно, он терпит неудачу с 6 тегами, как и должно. Это означает, что это гораздо более дальновидное регулярное выражение с меньшим количеством возвратов, лучшей производительностью и меньшей избыточностью.
ОБНОВЛЕНИЕ № 3:
Я вижу ошибку в моем пути. Это должно работать лучше.
Помещение непосредственно перед последним установит границу слова. Это позволяет правилу длиной 1-30 символов снова работать правильно.
3
Steve Wortham
24 Мар 2010 в 23:26
Вы можете сократить его до чего-то вроде
Мне всегда нравится делать свои регулярные выражения более краткими (где это не влияет на производительность).
Ben
24 Мар 2010 в 22:31
Ваш RE выглядит так, как будто он делает в точности то, что вы просили. Я мог бы рекомендовать не использовать RE вообще, хотя, в этом случае — просто разделите входные данные в пробеле на массив, а затем проверьте каждое значение в массиве самостоятельно.
RE это круто, но иногда они не лучший способ сделать работу
1
zigdon
24 Мар 2010 в 22:25
Что касается производительности, вы можете оптимизировать (улучшить) это следующим образом:
И добавьте пробел в начало, прежде чем тестировать регулярное выражение.
2
Pindatjuh
24 Мар 2010 в 22:34
Вы не собираетесь улучшать это. Все, что вы делаете для уменьшения длины, также затруднит чтение, и регулярные выражения в этом отношении не нуждаются. ; )
Тем не менее, ваше регулярное выражение должно быть более сложным в любом случае. Как написано, он не может гарантировать, что имена тегов не начинаются и не заканчиваются дефисом или не содержат двух или более последовательных дефисов. Регулярное выражение для одного тега должно быть структурировано следующим образом:
Тогда базовое регулярное выражение для соответствия до пяти тегов будет
… но это не обеспечивает максимальную длину тега. Я думаю, что самый простой способ сделать это — поместить ваше оригинальное регулярное выражение в будущее:
Предварительный просмотр обеспечивает длину тегов, а также общую структуру до пяти тегов, разделенных пробелами. Тогда основной корпус должен только обеспечить структуру отдельных тегов.
Я мог бы немного сократить регулярное выражение, оставив вне классов символов и добавив модификатор . Я этого не делал, потому что вы говорили об использовании регулярных выражений в валидаторе ASP.NET, и, насколько я знаю, они не позволяют использовать модификаторы регулярных выражений. А так как JavaScript не поддерживает встроенный синтаксис модификаторов, регулярные выражения валидатора без учета регистра невозможны. Если я ошибаюсь по этому поводу, я надеюсь, что кто-то меня поправит.
Alan Moore
25 Мар 2010 в 01:34
может заменить , но он также содержит _, если все в порядке.
Вы также можете разбить его немного так:
Если вам всегда гарантировано наличие пробелов, разделяющих ваши теги.
Dark Castle
24 Мар 2010 в 22:29