【问题标题】:regex wont work - bat pattern still right正则表达式不起作用 - 蝙蝠模式仍然正确
【发布时间】:2021-11-29 17:16:43
【问题描述】:

我的正则表达式不工作。我不明白为什么。

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);

【问题讨论】:

  • \^似乎没有匹配项
  • 为什么你认为这个模式是对的?
  • 不匹配 \\s\^ 令牌
  • 你想在那个字符串中匹配什么?
  • 另外,字符串中的\^^ 相同。如果您想转义 ^ 以便 new RegExp 将其视为文字 ^,则需要在字符串内执行 \\^ 以便 RegExp 内的最终结果为 \^ .否则反斜杠只是字符串的转义字符。

标签: javascript regex


【解决方案1】:

\^ 最终匹配一行的开头(因为您使用的是 m 修饰符)。您的字符串中没有换行符,因此无法将该字符串与您现在拥有的字符串匹配。

我能想到的可能解决方案是:

  • 在字符串末尾添加换行符 - 这不是最佳选择,除非您知道数据最终会以这种方式格式化,这可能是因为您使用了 g 和 m 修饰符。
  • \\s\^ 替换为$,因为它匹配行尾,无论后面是否有另一行——这可能是更好、更简洁的选择。

编辑:

为了澄清,既然你明确地问为什么它似乎不像你想要的那样匹配。您的正则表达式确实一直匹配到您拥有的最后一个\s,但在^ 处失败。关于您想要匹配的内容似乎有很多假设,因此解决方案会相应变化。是的,您可以像其他人建议的那样删除\^,但这将不再匹配整行,停在“PancakeSwap”处,我只能假设这不是您想要的?另一种“解决”这个问题的方法是从该字符串的末尾删除\s\^,并取最后一个(.*?) 并使其变得贪婪:(.*)。这种“贪婪”只是意味着它将尝试尽可能多地匹配(在大多数情况下),因此删除 \s^ 将允许它一直匹配到行尾——尽管如果这可能会适得其反在此之后最终会有更多的行。同样,我只能假设您打算一直匹配到行尾,因为这就是 \s^ 正在做的事情——尽管它只是在有另一行继续进行的情况下才会这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 2019-10-27
    • 2021-08-05
    • 1970-01-01
    相关资源
    最近更新 更多