REGEX от PHP до JS - PullRequest
       4

REGEX от PHP до JS

0 голосов
/ 18 февраля 2020

Не могли бы вы предложить, как исправить это выражение

(^([0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01]))(?:,\s*(?1))*$)

для использования с javascript, чтобы оно давало истинное значение, когда форматы даты равны yyyy-mm-yy и когда даты перечислены через запятую если их несколько?

Expected result:
2017-03-25, 2017-03-27, 2017-03-28 true
2017-03-25 true

1 Ответ

1 голос
/ 18 февраля 2020

Ваше регулярное выражение PHP содержит ошибку, а именно, круглые скобки группы 1 обертывают весь шаблон, в то время как возвращаемая часть должна быть только ([0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01]).

Итак, чтобы исправить PHP шаблон, вам нужно удалить внешние скобки:

^([0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01]))(?:,\s*(?1))*$

Поскольку подпрограмма регулярного выражения (?1) рекурсирует шаблон группы 1, все, что вам нужно, это повтор паттерн в JS регулярном выражении:

^[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])(?:,\s*[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01]))*$

См. это демонстрационное выражение регулярного выражения .

В JS коде, не пишите его как литерал регулярного выражения, создайте его динамически для упрощения обслуживания:

const date_reg = `[0-9]{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12][0-9]|3[01])`;
const reg = new RegExp(String.raw`^${date_reg}(?:,\s*${date_reg})*$`);
console.log(reg.test("2017-03-25, 2017-03-27, 2017-03-28"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...