Почему одно и то же одноразовое регулярное выражение ведет себя по-разному на двух платформах? - PullRequest
2 голосов
/ 25 октября 2019

Я пытаюсь проверить код RFC (мексиканский налоговый идентификатор) в форме с помощью JS и JQuery. Мне требуется только проверить, возвращает ли следующее совпадение регулярных выражений null:

function validateRFC(rfc) {
  const rgxFisica = "^(([A-ZÑ&]{4})([0-9]{2})([0][13578]|[1][02])(([0][1-9]|[12][\\d])|[3][01])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})([0][13456789]|[1][012])(([0][1-9]|[12][\\d])|[3][0])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([02468][048]|[13579][26])[0][2]([0][1-9]|[12][\\d])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})[0][2]([0][1-9]|[1][0-9]|[2][0-8])([A-Z0-9]{3}))$";

  return rfc.match(rgxFisica) != null
}

const foo = validateRFC("XXXX901212UDX");
console.log(foo);

Шаблон в основном XXXXYYMMDDYYY, где X должно быть буквой, YMD - это значения даты, а Y - любой буквенно-цифровой символ.

Я провел небольшой юнит-тест на codepen с моим реальным идентификатором, и он работает. Однако при тестировании в моей тестовой среде он всегда возвращает ноль. Вот скриншот. В случае, если это имеет значение, я рендую всю страницу с помощью Flask в Python 3.7, а проверка находится внутри document.ready

Возможно ли, что мой Javascript интерпретируетрегулярные выражения по-разному?

РЕДАКТИРОВАТЬ:

Кажется, встроенный фрагмент также возвращает true. Я использую VS2019 16.3.5, Python 16.3.19252.1 в 64-битной среде Python 3.7.

1 Ответ

0 голосов
/ 25 октября 2019

В некоторых случаях javascript, например, ECMAScript, в случае сбоя сопоставления вызов rfc.match(rgxFisica) вернет массив. Если совпадение пройдено, он вернет логическое значение true.

, см. Пример (https://jsfiddle.net/coq3Lugw/):

function validateRFC(rfc) {
  const rgxFisica = "^(([A-ZÑ&]{4})([0-9]{2})([0][13578]|[1][02])(([0][1-9]|[12][\\d])|[3][01])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})([0][13456789]|[1][012])(([0][1-9]|[12][\\d])|[3][0])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([02468][048]|[13579][26])[0][2]([0][1-9]|[12][\\d])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})[0][2]([0][1-9]|[1][0-9]|[2][0-8])([A-Z0-9]{3}))$";
    console.log(rfc.match(rgxFisica))

    console.log("hello 0670 world".match(rgxFisica))

  return rfc.match(rgxFisica) != null
}

const foo = validateRFC("XXXX901212UDX");
//console.log(foo);

, что я хотел бы сделать, это установить оператор if-then и вернуть таким образом:

function validateRFC(rfc) {
  const rgxFisica = "^(([A-ZÑ&]{4})([0-9]{2})([0][13578]|[1][02])(([0][1-9]|[12][\\d])|[3][01])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})([0][13456789]|[1][012])(([0][1-9]|[12][\\d])|[3][0])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([02468][048]|[13579][26])[0][2]([0][1-9]|[12][\\d])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})[0][2]([0][1-9]|[1][0-9]|[2][0-8])([A-Z0-9]{3}))$";

  if (rfc.match(rgxFisica)) == null{
      return True
  } else {
      return False
  }
}

const foo = validateRFC("XXXX901212UDX");
//console.log(foo);

Пример ИСТИННОГО совпадения с регулярным выражением:

function validateRFC(rfc) {
  const rgxFisica = "^(([A-ZÑ&]{4})([0-9]{2})([0][13578]|[1][02])(([0][1-9]|[12][\\d])|[3][01])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})([0][13456789]|[1][012])(([0][1-9]|[12][\\d])|[3][0])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([02468][048]|[13579][26])[0][2]([0][1-9]|[12][\\d])([A-Z0-9]{3}))|" +
    "(([A-ZÑ&]{4})([0-9]{2})[0][2]([0][1-9]|[1][0-9]|[2][0-8])([A-Z0-9]{3}))$";

 console.log(rfc.match(rgxFisica));

  if (rfc.match(rgxFisica) == null){
      return true
  } else{
      return false
  }
}

const foo = validateRFC("hello 0670 world");
console.log(foo);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...