Javascript - RegExp - 替换未被字母包围的字符

时间:2014-10-18 12:20:55

标签: javascript regex

我有这样的正则表达式:

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"

5 个答案:

答案 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)

试试这个正则表达式 -

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

DEMO

答案 4 :(得分:0)

尝试使用/([^a-zA-Z])?e(?![a-zA-Z])/g 和'$ 12.718281828459045'进行更换。

使用负面向前看,以及可选的前一个字母字符,因为JS(我知道)中没有任何外观。