我有一个像这样的正则表达式:
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"
最佳答案
这里的问题是第一个不匹配,因为 e
之后没有任何内容。 ,因此它必须检查 e
后跟不是输入的字母或结尾的内容。但是,第三个示例不起作用,因为在 2*e*e*2
中第一场比赛是*e*
,因此 *
被“消耗”,所以字符串剩下的只有 e*2
。这显然不能解决问题。
可以使用负前瞻来代替。它们写为a(?!b)
在正则表达式中 and (在本例中)表示 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>
替换,因为更容易看出替换是正确的。)
关于Javascript - RegExp - 替换未被字母包围的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26439658/