Пытаясь оптимизировать регулярное выражение - PullRequest
0 голосов
/ 04 февраля 2019

Проблема

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

То, что я пробовал

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

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

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

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

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

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

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

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

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

См. Демонстрационную версию регулярных выражений.

Подробности

  • ^ - начало строки
  • \d+ - 1+ цифр
  • (?: - начало сопоставления группы без захвата
    • [.:] - одна . или :
    • \d* - 0+ цифр
  • )? - 1 или 0 раз
  • $ - конец строки.
0 голосов
/ 04 февраля 2019

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

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

0 голосов
/ 04 февраля 2019

Как насчет \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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...