支持正则表达式的是后面还是后面?


12

我需要执行正则表达式查询替换,这样

fooin foo bar匹配,但fooin foo baz不匹配。通常我会使用regex向前看,例如foo(?=bar)

但是,似乎Emacs无法做到这一点?Vim似乎有能力,但spacemacs中的邪恶模式不能。


还有这个:github.com/gamesun/emacs-regex-lookaround,但是我没有尝试使用此补丁进行构建,而且看起来已经有一段时间了。
wvxvw

Answers:


10

不可以,Emacs正则表达式不支持任意零宽度的超前/后断言。

当涉及到有关Emacs Lisp语言实现的问题时,nb Evil和Spacemacs(与所有elisp库一样)是无关紧要的。


因此,它是不可能取代foofoobar,但不是foobaz?这是一个足够普遍的操作,我认为必须找到解决方案。也许向前和向后看是错误的方法?
海森堡

这并不完全等同,但将foo\(bar\)baz\1将在所有情况下都足以bar没有包含更多的匹配。
菲尔斯(Philips)

如果您正在编写elisp,则具有很大的灵活性,并且如果要进行交互式替换,则可以在替换过程中调用任意elisp,因此最终有多种方法可以执行这些操作。只是不如您使用这些断言那样方便。
菲尔斯(Philips)

例如:如果以下文字为,则“ 替换foo为” \,(if (looking-at "bar") "baz" \&)将替换为“ (否则替换为” )。后面跟,仍然与仅匹配不一样,但这是另一种选择。foobazbarfoofoo foobar
菲尔斯(Phil)

我想这就像您在上面说的一样,但是似乎可以键入:CSM-%foo \(bar \)RET FOO \ 1 RET用FOO bar替换所有foo bar,但不要理会所有foo baz。这是否缺少您想要的东西?
约翰·基钦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.