регулярное выражение не сработает — шаблон летучей мыши все еще правильный

#javascript #regex

Вопрос:

мои регулярные выражения не работают. Я не могу понять, Почему.

 let text = '0x00d38f0ff55cf1b18841a7e7993eb5b1df791f7be40a828b94e6df90dafd9d722021-11-28 23:08:3918 hrs 5 mins ago0xba4090fb813a5da6c24d53149d98d8539e2469caOUT PancakeSwap V2: HTD-BUSD 1445.871849548172161305 HeroesTD (HTD)';  let regex = new RegExp("(.*?)2021(.*?)ago(.*?)(IN|OUT)(.*?)\s(.*?)\s^", "gm");   let result; result = regex.exec(text);   console.log(result);  

Комментарии:

1. Кажется, что нет никакого соответствия для ^

2. Почему вы считаете, что эта схема верна?

3. Не совпадает с \s и ^ токеном

4. Что вы пытаетесь сопоставить в этой строке?

5. Кроме того, ^ в строке то же самое, ^ что и . Если вы хотите избежать ^ так , чтобы new RegExp оно рассматривалось как литерал ^ , вам нужно будет сделать \^ это внутри строки, чтобы конечный результат внутри регулярного выражения был ^ . В противном случае обратная косая черта является просто escape — символом для строки.

Ответ №1:

В ^ итоге получается совпадение с началом строки (так как вы используете модификатор m). В вашей строке нет символов новой строки, поэтому невозможно сопоставить эту строку с тем, что у вас есть прямо сейчас.

Возможные решения, которые я могу придумать, таковы:

  • Добавьте новую строку в конец строки-не лучший вариант, если вы не знаете, что ваши данные будут отформатированы таким образом, что может произойти, учитывая, что вы используете модификаторы g и m.
  • Замените \s^ на a $ , так как это соответствует концу строки, независимо от того, идет ли за ней другая строка или нет-вероятно, лучший, более чистый вариант.

Редактировать:

Для уточнения, поскольку вы явно спросили, почему это не похоже на соответствие, как вы хотите. Ваше регулярное выражение полностью совпадает с последним s , которое у вас есть, но терпит неудачу ^ . Похоже, существует множество предположений о том, чему вы хотите соответствовать, и поэтому решение будет соответственно отличаться. Да, вы могли бы просто удалить ^ то, что предлагали другие, но это больше не соответствовало бы всей строке, остановившись только на «блинах», что, как я могу только предположить, не то, что вы хотите? Другим способом «исправить» это было бы удалить s^ из конца этой строки и принять это окончательное (.*?) и сделай его жадным: (.*) . Эта «жадность» просто означает, что он будет стараться соответствовать столько, сколько сможет (по большей части), поэтому удаление s^ позволит ему соответствовать до конца строки-хотя это может привести к обратным последствиям, если после этого появится больше строк. Опять же, я могу только предположить, что вы намерены соответствовать до конца строки, поскольку это то, что s^ делается-хотя это делается только в присутствии другой строки, продолжающей ее.