#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^
делается-хотя это делается только в присутствии другой строки, продолжающей ее.