Я использую это простое регулярное выражение для проверки шестнадцатеричной строки:
^[A-Fa-f0-9]{16}$
Как видите, я использую квантификатор, чтобы проверить, что строка имеет длину 16 символов. Мне было интересно, могу ли я использовать другой квантификатор в том же регулярном выражении, чтобы проверить, что длина строки равна 16 или 18 (а не 17).





^(?:[A-Fa-f0-9]{16}|[A-Fa-f0-9]{18})$
Это всего лишь требование 16 символов с необязательными 2 символами впоследствии:
^[A-Fa-f0-9]{16}([A-Fa-f0-9]{2})?$
Скобки могут не потребоваться - боюсь, я недостаточно разбираюсь в регулярных выражениях, чтобы знать наверняка. Если кто-то хочет его отредактировать, не стесняйтесь ...
Круглые скобки здесь обязательны. Если вы их опустите, символ? делает {2} ленивым, что здесь не действует.
Я считаю
^([A-Fa-f0-9]{2}){8,9}$
будет работать.
Это хорошо, потому что оно обобщается на любую строку четной длины.
Согласен, лучше: +1 (если Алонсо хочет поставить отметку «галочка» на этом ответе, а не на моем, я бы понял;))
Внутреннее выражение можно оптимизировать до ([A-Fa-f0-9] {2}), может быть, даже до ([[: xdigit:]] {2}) или (\ p {XDigit} {2}). В зависимости от вашего вкуса регулярных выражений заранее созданные классы символов, такие как POSIX, работают лучше, чем созданные вручную.
Это похоже на хорошее решение, и я собираюсь им воспользоваться. Но я этого не понимаю. Есть ли шанс, что кто-нибудь сможет это объяснить? Если шестнадцатеричные символы могут быть 0-9 и A-F, я не понимаю разбивки A-FA-f0-9. Я думал, что диапазон будет содержать нижнюю и верхнюю границу, например 0-9. Как здесь может быть четыре группы? А что означает A-FA? Я знаю, что это работает, я просто хотел бы понять это.
В предложении [] есть три диапазона: A-F соответствует буквам в верхнем регистре, a-f соответствует буквам в нижнем регистре, а 0–9 соответствует цифрам.
Ах. Так просто. Вот что мне было нужно. Спасибо!
Я бы, наверное, пошел с
/^[a-f0-9]{16}([a-f0-9]{2})?$/i
себя. Я думаю, что более читабельно установить регулярное выражение как нечувствительное к регистру и указать диапазон символов только один раз. Тем не менее, почти все эти ответы работают.
Как и многие другие вещи, это компромисс ... / [a-f] / i может быть более читаемым (или не может, в зависимости от читателя), но / [A-Fa-f] / будет работать быстрее. Возможно, разницы в производительности недостаточно, чтобы иметь значение в этом случае.
С точки зрения производительности это много лучше. Гораздо меньше отказов от несоответствия. +1