Javascript-RegExp-Replace未被字母包围的字符

Javascript-RegExp-Replace未被字母包围的字符,javascript,regex,Javascript,Regex,我有一个这样的正则表达式: str.replace(/([^a-zA-Z])e([^a-zA-Z])/g, "$12.718281828459045$2") 正则表达式没有做我想做的,我也不知道为什么 所以我想做的是,用 “2.718281828459045”,我的正则表达式怎么了 "2e" -> "2e", should be: "22.718281828459045" "2e2" -> "22.7182818284590452", working "2*e*e*2" ->

我有一个这样的正则表达式:

str.replace(/([^a-zA-Z])e([^a-zA-Z])/g, "$12.718281828459045$2")
正则表达式没有做我想做的,我也不知道为什么

所以我想做的是,用 “2.718281828459045”,我的正则表达式怎么了

"2e" -> "2e", should be: "22.718281828459045"
"2e2" -> "22.7182818284590452", working
"2*e*e*2" -> "2*2.718281828459045*e*2", should be "2*2.718281828459045*2.718281828459045*2"

第二组括号使用正则表达式字符串的该部分。这意味着剩余的字符串
e*2
不匹配,因为
e
前面没有非字母数字字符。您可以使用不消耗的前瞻

"2*e*e*2".replace(/([^a-zA-Z])e(?=[^a-zA-Z])/g, "$12.718281828459045")
试试这个正则表达式-

Regex   - ([^a-zA-Z])?(?:e(?:.*e)?)([^a-zA-Z])?
Replace - $12.718281828459045$2

那么:

find:    /(^|[^a-zA-Z])e(?=[^a-zA-Z]|$)/g
replace: $12.718281828459045


这里的问题是第一个不匹配,因为
e
后面没有任何内容,因此它必须检查
e
后面是否有非字母或输入结尾的内容。但是,第三个示例不起作用,因为在
2*e*e*2
中,第一个匹配项是
*e*
,因此两个
*
都被“消耗”,所以字符串中只剩下
e*2
。这显然不能解决问题

可以用来代替的是消极的前瞻。它们在正则表达式中写为
a(?!b)
,并且(在本例中)表示
a
后面不跟a
b
。因此,我们将正则表达式转换为
([^a-zA-Z])e(?[a-zA-Z)
。但是,这仍然与简单字符串
e
不匹配,因为前面没有任何内容。在非JavaScript的东西中,我们可以使用反向查找,尽管js不支持,所以只需将其更改为
(^[a-zA-Z])e(?[a-zA-Z])/code>

意思是:查找任何位于字符串开头的
e
,或者在非a-z或a-z的内容之后,并且后面没有a-z或a-z

这是一个工作演示:(注意,我用
替换了,因为更容易看出替换是正确的。)

尝试
/([^a-zA-Z])?e(?![a-zA-Z])/g
以及"12.718281828459045元"作更换


使用负向前看和可选的前一个字母字符,因为JS中没有向后看(据我所知)。

2e
将不起作用,因为在
e
@vks之后没有任何内容,那么“2*e*e*2”如何?你可以用负向前看解决这个问题。此处显示的工作:@Alxandr发布答案?(“2*e”)。替换(/([^a-zA-Z])e(=2.2“2.7182828282828282828282828284594545”应该是“2.2.71828282828282828282828282828282845959454545”(简称“e*e”)。替换(替换)替换(替换)替换(替换)替换(替换)替换(替换)替换(替换)替换(替换)(2(a-a-a-a-扎扎扎扎扎扎扎扎扎扎扎扎扎兹)可能(((((((((()))))例如::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::>g
(全球)修饰符。看到我的编辑了吗?这和你的有什么区别吗?不完全一样,他使用消极前瞻,我使用积极前瞻。在我发布我的答案之前,我还没有看到他的答案。@Murplyx:t你最了解的答案。这只是一个品味的问题,但这个比积极的答案占用的空间少,这有什么区别吗是吗?所以这应该是(^.[^a-zA-Z])e(?![a-zA-Z]|$)而不是(^.[^a-zA-Z])e(?[a-zA-Z])?不,负前瞻处理的是字符串的结尾。你可以在这里看到:So/(^.[^a-zA-Z])e(?[a-zA-Z])/g==/(^.[^a-zA-Z])e=[^a-zA-Z]),罗马似乎不止一条路。
str.replace(/(^|[^a-zA-Z])e(?=[^a-zA-Z]|$)/g, "$12.718281828459045")