Javascript 更换一个';s';如果有';它不是一个';s';在它之前

Javascript 更换一个';s';如果有';它不是一个';s';在它之前,javascript,jquery,regex,Javascript,Jquery,Regex,我以为[^abc]的意思是“不是这些字符中的任何一个”,但在上面的代码中,只有在前面有一个s时,它才替换单词末尾的s。如何将这个正则表达式转换为:仅当前面没有s时,才替换单词末尾的s?最简单的方法是使用负回溯,但JavaScript不支持这一点。因此,我们只使用反向引用: .replace(/([^s]?s)$/, '') 这将匹配单词末尾的两个字符,第一个是“s”之外的字符,第二个是“s”,并用第一个匹配字符(非“s”)替换它们 顺便说一句,这个正则表达式将忽略一个纯粹由字母“s”组成的单词

我以为
[^abc]
的意思是“不是这些字符中的任何一个”,但在上面的代码中,只有在前面有一个s时,它才替换单词末尾的s。如何将这个正则表达式转换为:仅当前面没有s时,才替换单词末尾的s?

最简单的方法是使用负回溯,但JavaScript不支持这一点。因此,我们只使用反向引用:

.replace(/([^s]?s)$/, '')
这将匹配单词末尾的两个字符,第一个是“s”之外的字符,第二个是“s”,并用第一个匹配字符(非“s”)替换它们

顺便说一句,这个正则表达式将忽略一个纯粹由字母“s”组成的单词。我不知道你打算怎么处理那个案子。如果你删除了这个词后面的“s”,那么你就删除了整个词



原始正则表达式不起作用的原因是您有
字符,这使得非s匹配成为可选的,并且您实际上没有提供任何替换字符串,这意味着如果非s原子匹配,那么它将被删除。换句话说,在
“foos”
上运行该命令将导致
“fo”
而不是
“foo”
。在
“foss”
上运行它将产生
“fos”
(因为它跳过了非s原子)。

你的意思是说删除而不是替换吗?嗯<代码>“fas”。替换(/([^s]?s)$/,“”)结果为
“f”
。因此,它似乎确实取代了最后一个
s
(和前面的字符)。我不想投票支持这个问题,因为OP的声誉目前是“1337”…格雷格尔,这太好笑了。。。不过现在它已经不见了,我想我和其他人一样都很正常了。当你只知道正则表达式的一些诀窍时,它可能是如此的晦涩难懂。
.replace(/([^s])s\b/, '$1')