我有这样的正则表达式:
str.replace(/([^a-zA-Z])e([^a-zA-Z])/g, "$12.718281828459045$2")
正则表达式并不是我想要的,我也不知道为什么。
所以我想要做的就是用一个没有连接到任何A-z字母的字符串替换所有" e"""" " 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"
答案 0 :(得分:2)
这里的问题是第一个不匹配,因为e
之后没有任何内容,因此它必须检查e
后面跟不是字母或输入结束。但是,第三个示例不起作用,因为在2*e*e*2
中,第一个匹配是*e*
,因此*
都被消费了#34;所以'字符串的左边只有e*2
。这显然无法解决问题。
可以使用什么是负面的前瞻。它们在正则表达式中写为a(?!b)
,(在本例中)表示a
后面没有b
。因此我们将正则表达式设为([^a-zA-Z])e(?![a-zA-Z)
。但是,这仍然与简单字符串e
不匹配,因为它前面没有任何内容。在一些不是JavaScript的东西中,我们可以使用负面的外观,虽然js不支持这一点,所以只需将其改为(^|[^a-zA-Z])e(?![a-zA-Z])
。
含义是:找到位于字符串开头的任何e
,或者在不是a-z或A-Z之后,并且后面没有a-z或A-Z的任何内容。
以下是工作演示:http://regex101.com/r/wQ1oW3/3(注意,我已更换为<input>
,因为更简单地看到替换是正确的。)
答案 1 :(得分:1)
怎么样:
find: /(^|[^a-zA-Z])e(?=[^a-zA-Z]|$)/g
replace: $12.718281828459045
str.replace(/(^|[^a-zA-Z])e(?=[^a-zA-Z]|$)/g, "$12.718281828459045")
答案 2 :(得分:0)
第二组括号使用正则表达式的那部分字符串。这意味着剩余的字符串e*2
不匹配,因为e
前面没有非字母数字字符。您可以使用前瞻性而不消耗。
"2*e*e*2".replace(/([^a-zA-Z])e(?=[^a-zA-Z])/g, "$12.718281828459045")
答案 3 :(得分:0)
答案 4 :(得分:0)
尝试使用/([^a-zA-Z])?e(?![a-zA-Z])/g
和'$ 12.718281828459045'进行更换。
使用负面向前看,以及可选的前一个字母字符,因为JS(我知道)中没有任何外观。