После того как вы обновили свой вопрос, новое регулярное выражение, которое работает для вас, должно выглядеть следующим образом:
^0x(?:[0-9A-Fa-f]{2})+$
Где я использую (?:
для группировки без захвата для эффективности.{2}
означает, что вы хотите два предыдущих выражения (т.е. два шестнадцатеричных символа), +
означает, что вы хотите один или несколько шестнадцатеричных символов.Обратите внимание, что это запрещает 0x
в качестве допустимого значения.
Efficiency
«Одед» упомянул кое-что об эффективности.Я не знаю ваших требований, поэтому считаю это больше упражнением для ума, чем чем-либо еще.Регулярное выражение будет делать скачки до тех пор, пока наименьшее соответствующее регулярное выражение.Например, если я попробую собственное регулярное выражение на 10000 переменных строк ввода размером 50-5000 символов, все правильно, оно будет выполнено за 1,1 секунды.
Когда я попробую следующее регулярное выражение:
^0x(?:[0-9A-Fa-f]{32})+(?:[0-9A-Fa-f]{2})+$
он работает примерно на 40% быстрее, за 0,67 секунды.Но будь осторожен.Знание вашего вклада - это умение писать эффективные регулярные выражения.Например, если регулярное выражение завершится неудачей, будет выполнено много обратных проверок.Если половина моих входных строк имеет неправильную длину, время выполнения увеличивается примерно до 34 секунд, или 3000% (!), Для того же ввода.
Становится еще сложнее, если большинство входных строк большие.Если 99% вашего ввода имеет допустимую длину, все> 4130 символов, и только некоторые из них - нет, запись
^0x(?:[0-9A-Fa-f]{4096})+^0x(?:[0-9A-Fa-f]{32})+(?:[0-9A-Fa-f]{2})+$
эффективна и еще больше увеличивает время.Однако, если у многих есть неправильный length % 2 = 0
, это неэффективно из-за обратного отслеживания.
Наконец, если большинство ваших строк удовлетворяют правилу четных чисел, и только некоторые или несколько строк содержат неправильный символ, скорость возрастает: чем больше входных данных содержит неправильный символ, тем выше производительность.Это потому, что, когда он находит недопустимый символ, он может сразу же всплыть.
Вывод: если ваш ввод смешанный, маленький, большой, неправильный символ, неправильный подсчет, ваш самый быстрый подход - использовать комбинацию проверкидлина строки (мгновенно в .NET) и использовать эффективное регулярное выражение.