Мне нужно RegExp для проверки строк, которые должны состоять из допустимых целых десятичных чисел, включая ноль (0
, 1
, 12
, 123
, но не 00
или 0123
), смешанных со специальным символом (например, x
) в свободных вхождениях:
Примеры допустимых строк:
0
, 1
, 123
, x
, xx
, x0
, 0x
, x0x
, 0x0
, xx123x0
, x1000xx5xxx
, ...
Недопустимые: 00
, x00
, 01
, x01
, ... и практически все, включая неверные числа (начинающиеся с 0
, но не являющиеся нулевыми).
Я придумал следующее:
new RegExp('^0?$|^((?!0)[0-9]+|x0$|0x|x+)+$')
К сожалению, это не работает на 100%, например. допустимая строка не принимается: 0x0
.
Спасибо за любую помощь!
@CBroe Обновлено, все примеры действительны, поэтому я добавил еще несколько недопустимых примеров.
Это уже решено, но есть еще одна идея: ^\b(?:(?:x|^)(?:0|[1-9]\d*)?)+$
почему 0x0 допустимо?
@bobblebubble Отлично! Тоже работает, спасибо!
@DuesserBaest 0
(ноль) — допустимое число, два из них смешаны с одним x
— соответствует определению
ааа, теперь я понял. я думал, это должно быть одно число, разделенное буквами x
Я думаю, это то, что вы хотите:
new RegExp('(^0(x\d+)?$)|(^[1-9]\d*$)')
К сожалению, это работает не почти во всех случаях, например, это не соответствует допустимой строке x0
, но соответствует недопустимым строкам 0x00
и 0x01
.
Я получил это регулярное выражение для работы с каждым из ваших примеров:
new RegExp('^(((?<![0-9])([1-9][0-9]*)?[0-9]?)x*)+$')
Я должен отметить, что он основан на «негативном взгляде назад», который может не поддерживаться более старыми средами. Я еще не сталкивался с какими-либо проблемами совместимости при использовании его в современном браузере.
RegExr.com может быть весьма полезен для визуального объяснения каждой части регулярного выражения.
Это отлично работает, спасибо! Моя среда выполнения — Node, поэтому проблем с совместимостью у меня нет.
Я рад, что смог найти для вас рабочее решение!
Идея без использования обходных путей:
^\b(?:(?:x|^)(?:0|[1-9]\d*)?)+$
Посмотрите эту демонстрацию на сайте regex101
действительно элегантный ответ!
Пожалуйста, уточните, каким из приведенных примеров значений он действительно должен соответствовать, а каким нет.