在 vim
中,我想在搜索和替换操作中匹配正则表达式,但有异常(exception)——我想跳过的匹配列表。
例如,假设我有文本:
-one- lorem ipsum -two- blah blah -three- now is the time -four- the quick brown -five- etc. etc.
(但有很多其他可能性)我想匹配 -\(\w\+\)-
并将其替换为 *\1*
但跳过超过(不匹配)-two-
和 -four-
,所以结果将是:
*one* lorem ipsum -two- blah blah *three* now is the time -four- the quick brown *five* etc. etc.
似乎我应该能够为此使用某种断言(后视、前视等),但我一头雾水。
最佳答案
您正在寻找一个否定前瞻断言。在 Vim 中,这是通过 :help /\@!
完成的。 ,就像 Perl 中的 (?!pattern)
。
基本上,你在这里说不匹配FOO
,一般匹配单词字符:
/-\(\%(FOO\)\@!\w\+\)-/
请注意我是如何使用非捕获组 ( :help /\%(
)。仍然缺少的是最后的断言,因此上面的内容也会排除 -FOOBAR-
。由于我们这里有一个独特的结束分隔符,因此最容易附加:
/-\(\%(FOO-\)\@!\w\+\)-/
应用于您的示例,您只需引入两个分支(用于两个排除)来代替 FOO
,您就完成了:
/-\(\%(two-\|four-\)\@!\w\+\)-/
或者,通过分解重复的结束分隔符:
/-\(\%(\%(two\|four\)-\)\@!\w\+\)-/
这匹配破折号之间的任何单词字符,除了如果这些单词形成两个
或四个
。
关于regex - 如何匹配模式跳过异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54363427/