regex.exec возвращается 'null', когда другие возвращают свои значения - PullRequest
1 голос
/ 02 мая 2019

Я пытаюсь создать соответствие для регулярного выражения, но оно все время говорит, что оно 'null'. Я объявил другую переменную точно таким же образом, и она отлично возвращает значения.

  • Я убедился, что ecommerceRegEx утешает его значение.
  • Я убедился, что ecommercePortalAppointmentTime утешает его значение.
  • Я добавил await в .exec, который работал для объявления других переменных.

  • Я убедился, что все написано правильно и все переменные ссылаются правильно.

//RegEx I am using
var ecommerceRegEx = /((?<time>\d+:\d+) (?<modifier>[AP])M (?<timezone>[A-Z]+))/gm

//Object I am getting the DOM property for
var ecommercePortalAppointmentTime = await Selector('[class="availability-option"]').find('span').nth(0).innerText

//Match I am attempting to create
var ecommercePortalMatch = ecommerceRegEx.exec(await ecommercePortalAppointmentTime)

//Console.log I am verifying the value is returned correctly
console.log("Ecomm Match: " + ecommercePortalMatch)

//Returns 'null'

Ожидаемый результат: должен быть создан массив со значениями для каждой группы. Например, если строка: «Ваша встреча в 9:00 утра CDT», массив должен быть [9:00, AM, CDT]

Фактический результат: возвращает «ноль»

Ответы [ 2 ]

1 голос
/ 02 мая 2019

Избавьтесь от модификатора g в регулярном выражении.Это следует использовать только с .exec(), когда вы используете регулярное выражение в цикле, чтобы найти все совпадения в одной строке.Это заставляет регулярное выражение запоминать позицию в строке, где закончилось совпадение, так что следующий вызов может искать совпадение после этого.

Но если вы используете регулярное выражение с другой строкой, он начнет искатьв той строке из индекса, где он нашел совпадение в предыдущей строке.Если это после совпадения в этой строке, он не найдет его.

Модификатор g также полезен при использовании .match() для возврата всех совпадений регулярного выражения в массиве (но тогда выне могу получить группы захвата, вот почему вы), и с .replace() заменить все совпадения.

0 голосов
/ 02 мая 2019

2-й await внутри вашего ecommerceRegEx.exec не имеет смысла. Вы уже использовали await, чтобы получить эту переменную.

Кроме того, ваше регулярное выражение не является допустимым регулярным выражением JavaScript, поскольку JS не поддерживает именованные группы захвата. Похоже, что когда вы отлаживали его на regex101.com, вы использовали опцию PHP. Вы можете изменить это в левом меню.

Попробуйте это:

//RegEx I am using
var ecommerceRegEx = /((\d+:\d+) ([AP])M ([A-Z]+))/gm

//Object I am getting the DOM property for
var ecommercePortalAppointmentTime = await Selector('[class="availability-option"]').find('span').nth(0).innerText

//Match I am attempting to create
var ecommercePortalMatch = ecommerceRegEx.exec(ecommercePortalAppointmentTime)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...