【问题标题】: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】:
一个非正则表达式的解决方案可以是这样的
- 检查字符串是否以
(开头并以)结尾然后返回false
- 如果没有,则检查其中是否有
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)))