regex - 如何匹配模式跳过异常?

标签 regex vim

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/

相关文章:

regex - 如何在最后一次模式出现时/之后对齐?

vim - 如何删除特定行上方的所有文本

javascript - 正则表达式删除扩展名和号码

Java 正则表达式使用模式替换文本之间

javascript - 如何使这个正则表达式与 JavaScript 兼容?

vim - 是否可以使用vim对象选择heredoc或 "here document"?

java - Android:将文本字段限制为一位小数

java - 使用单引号作为分割点将字符串分割为子字符串,但不要在引号前面加上反斜杠 (\) 并后跟另一个引号

vim - 如何在 Vim 自动完成后自动删除预览窗口?

vim - 从目录中递归包含 ctags 文件