Регулярное выражение для проверки шестнадцатеричной строки

Я использую это простое регулярное выражение для проверки шестнадцатеричной строки:

^[A-Fa-f0-9]{16}$

Как видите, я использую квантификатор, чтобы проверить, что строка имеет длину 16 символов. Мне было интересно, могу ли я использовать другой квантификатор в том же регулярном выражении, чтобы проверить, что длина строки равна 16 или 18 (а не 17).

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
14
0
25 130
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

^(?:[A-Fa-f0-9]{16}|[A-Fa-f0-9]{18})$

Это всего лишь требование 16 символов с необязательными 2 символами впоследствии:

^[A-Fa-f0-9]{16}([A-Fa-f0-9]{2})?$

Скобки могут не потребоваться - боюсь, я недостаточно разбираюсь в регулярных выражениях, чтобы знать наверняка. Если кто-то хочет его отредактировать, не стесняйтесь ...

С точки зрения производительности это много лучше. Гораздо меньше отказов от несоответствия. +1

Tomalak 13.11.2008 20:58

Круглые скобки здесь обязательны. Если вы их опустите, символ? делает {2} ленивым, что здесь не действует.

Jan Goyvaerts 14.11.2008 13:05
Ответ принят как подходящий

Я считаю

^([A-Fa-f0-9]{2}){8,9}$

будет работать.

Это хорошо, потому что оно обобщается на любую строку четной длины.

Согласен, лучше: +1 (если Алонсо хочет поставить отметку «галочка» на этом ответе, а не на моем, я бы понял;))

VonC 13.11.2008 21:02

Внутреннее выражение можно оптимизировать до ([A-Fa-f0-9] {2}), может быть, даже до ([[: xdigit:]] {2}) или (\ p {XDigit} {2}). В зависимости от вашего вкуса регулярных выражений заранее созданные классы символов, такие как POSIX, работают лучше, чем созданные вручную.

Tomalak 13.11.2008 21:21

Это похоже на хорошее решение, и я собираюсь им воспользоваться. Но я этого не понимаю. Есть ли шанс, что кто-нибудь сможет это объяснить? Если шестнадцатеричные символы могут быть 0-9 и A-F, я не понимаю разбивки A-FA-f0-9. Я думал, что диапазон будет содержать нижнюю и верхнюю границу, например 0-9. Как здесь может быть четыре группы? А что означает A-FA? Я знаю, что это работает, я просто хотел бы понять это.

Bob Horn 26.07.2011 19:13

В предложении [] есть три диапазона: A-F соответствует буквам в верхнем регистре, a-f соответствует буквам в нижнем регистре, а 0–9 соответствует цифрам.

David Norman 26.07.2011 19:40

Ах. Так просто. Вот что мне было нужно. Спасибо!

Bob Horn 26.07.2011 20:11

Я бы, наверное, пошел с

/^[a-f0-9]{16}([a-f0-9]{2})?$/i

себя. Я думаю, что более читабельно установить регулярное выражение как нечувствительное к регистру и указать диапазон символов только один раз. Тем не менее, почти все эти ответы работают.

Как и многие другие вещи, это компромисс ... / [a-f] / i может быть более читаемым (или не может, в зависимости от читателя), но / [A-Fa-f] / будет работать быстрее. Возможно, разницы в производительности недостаточно, чтобы иметь значение в этом случае.

Dave Sherohman 14.11.2008 21:33

Другие вопросы по теме