Пытаясь оптимизировать регулярное выражение

1

проблема

Я пытаюсь получить регулярное выражение, которое соответствует [0-9]:[0-9] или [0-9].[0-9] или [0-9] или [0-9]: или [0-9].

Что я пробовал

/^\d?(\d+)?((\.|\:|\d)$|(\.|\:|\d)(\d+)?\d$)/

Это регулярное выражение, удовлетворяющее моему условию.

Мой оптимизированный код

\d+[\.:]*\d*

Но это принимает 2:2: На самом деле это не должно быть. Не в состоянии решить это.

  • 0
    Попробуйте ^\d+(?:[.:]\d*)?$ , См. Демонстрацию .
  • 0
    обычно регулярные выражения компилируются в оптимизированную форму (конечный автомат), так зачем пытаться оптимизировать их самостоятельно? Выражение, которое вы получили в первом случае, сработало, затем используйте его. Во втором нет больше эффективности, это проще, потому что это соответствует более простой форме ввода. Поскольку оба анализируют ввод за один проход, выполняя один и тот же алгоритм автомата (из состояния X с входом Y, переходят в состояние Z и принимают или нет), единственное, что изменяется, - это таблица, используемая для анализа.
Теги:

3 ответа

1
Лучший ответ

Ваш \d+[\.:]*\d* не привязан и соответствует частичным подстрокам, соответствующим шаблону. Кроме того, он соответствует 11.....::: как строки, как [.:]* Соответствует 0+ . или : символы.

Вы можете использовать

^\d+(?:[.:]\d*)?$

Смотрите демо регулярных выражений.

подробности

  • ^ - начало строки
  • \d+ - 1+ цифры
  • (?: - начало сопоставления группы без захвата
    • [.:] - один . или :
    • \d* - 0+ цифры
  • )? - 1 или 0 раз
  • $ - конец строки.
  • 1
    Это работает хорошо. Благодарю.
  • 0
    @RinoRaj Привет, можно попросить об одолжении? Я думаю, что этот вопрос был неправильно отмечен как дурак . Не могли бы вы подать голосование заново? (Пожалуйста, не отвечайте на комментарий, я скоро его удалю.)
1

Как насчет \d([:.]\d?)? ? Это должно обрабатывать все случаи, которые вы упомянули.

Или \d+([:.]\d*?)? если вы хотите принять более одной цифры в каждом номере.

Чтобы соответствовать, только если точно, просто добавьте ^ в начало и $ в конец регулярного выражения. Пример:

const regex = /^\d+([:.]\d*?)?$/

console.log(regex.test('2'))
console.log(regex.test('2:'))
console.log(regex.test('2.'))
console.log(regex.test('2:3'))
console.log(regex.test('2.3'))
console.log(regex.test('12:23'))
console.log(regex.test('23.34'))
console.log(regex.test('2:3:4'))
console.log(regex.test('2.3.4'))
  • 0
    Опечатка. Виноват. Должен был проверить перед редактированием ...
  • 0
    без проблем :). В любом случае вам не нужен наименьший квантификатор?
Показать ещё 3 комментария
0

2: 2: не совпадает полностью, только подстрока 2: 2

Чтобы избежать этого, просто используйте якоря ^ и $, как вы использовали в исходном шаблоне. Ниже приведен рабочий пример регулярного выражения с использованием вашего оптимизированного регулярного выражения с добавленными якорями - /^\d+[.:]?\d*$/, а здесь ссылка на него https://regexr.com/47msc.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню