【问题标题】:match something not followed AND preceded by something匹配未跟随的东西和前面的东西
【发布时间】:2020-02-26 04:08:10
【问题描述】:

我想匹配每个“e”字符,它不是由括号括起来的科学 e 符号(例如 3e+6)的一部分。我可以毫无问题地做相反的事情:/(?<=\(\d)e(?=[+-]\d+\)/)
问题是,如果我尝试这样做(/(?<!\(\d+)e(?![+-]\d+\))/),只要第一部分或最后一部分不匹配(不匹配),它就不会匹配。

简而言之,它应该匹配 e in:

23e+4
4e
e
e+5)
(4e

但不在:

(23e+5)

(或匹配任何与此/\(\d+e[+-]\d+\)/不匹配的e)

提前谢谢你:)

【问题讨论】:

    标签: javascript regex regex-lookarounds


    【解决方案1】:

    因为你原来的模式是

    \(\d+e[+-]\d+\)
    

    要反转这种逻辑,您可以交替使用:

    • \(\d+ 进行否定回溯,然后匹配e,然后
    • e 的匹配项,然后是[+-]\d+\) 的负前瞻:
    (?<!\(\d+)e|e(?![+-]\d+\))
    

    https://regexr.com/4v3sg

    【讨论】:

      【解决方案2】:

      一个非正则表达式的解决方案可以是这样的

      1. 检查字符串是否以(开头并以)结尾然后返回false
      2. 如果没有,则检查其中是否有e,是否相应地返回布尔值

      let arr = [`23e+4`,`4e`,`e`,`e+5)`,`(4e`,`(23e+5)`]
      
      let checker = v =>
        v.startsWith('(') && v.endsWith(')') ? 'false' : v.includes('e')
      
      arr.forEach(v => console.log(checker(v)))

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-28
        • 1970-01-01
        相关资源
        最近更新 更多