如何在vim正则表达式中过滤掉包含某些字符串的结果?

wbgh16ku  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(269)

假设我有一堆代码,格式像verilog input/output (wire {signal_name}(,)

input  wire aaa,
input  bbb,               // "wire" can be omitted 
input  wire ccc           // the comma can be omitted
input  wire ddd_0,
output ddd_1  
output wire ddd_1,
output wire EEE_E,

我想捕获信号名称,如aaabbb ... EEE_E我的正则表达式是:

/\v(((input)|(output))[ ]+(wire)*[ ]*)@<=([_0-9a-zA-Z]+)

但看起来"wire"本身也匹配这种模式,将被捕获。
我可以使用'\n' '",\n”'来确保不会捕获到"wire",因为"wire"后面永远不会有'\n'或'",\n”'。但是,有没有通用的方法来过滤掉vim正则表达式中的某些字符串或某些模式呢?

outcomes.filter_out("wire")

也许我需要一个更简单的例子?假设我有一堆由{'a'-'z', '0'-'9', '_', '$', '%'}组成的“word”

11 apple pear banan0 wire _work m$oney && books wire word air 22

如果我用
/\v(\s|^)@<=([a-z]*)\ze(\s|$)
我得到了所有“纯”字:
apple pear wire books wire word air .
但是,如果我不想匹配wire,而只想匹配:
apple pear books word air

ej83mcc0

ej83mcc01#

若要在句子中查找单词applepearbookswordairwires
11苹果梨banan 0丝_工m$oney &&书丝字空气22
您可以使用lookarounds和\v来实现非常神奇的模式

\v\S@<!(wire\S@!)@![a-z]+\S@!

说明

  • \v非常神奇模式
  • \S@<!负lookbehind,向左Assert一个空白边界
  • (wire\S@!)负lookahead,Assert不是单词wire直接到右边,后面是空白边界
  • [a-z$%]+匹配字符类中列出的一个或多个字符
  • \S@!负lookahead,在右侧Assert空白边界

您可以扩展此机制,以匹配问题第一部分中的输入/输出示例。
请注意,要查看所附图像中的突出显示,可以运行:set hls

pdtvr36n

pdtvr36n2#

\(in\|out\)put\s\+\(wire\s*\)*\zs\([^, ]\+\)

似乎做你想做的(或者至少我认为你想做的):

至于你的问题:
但是有没有通用的方法来过滤掉vim正则表达式中的某些字符串或某些模式?
你的例子似乎根本没有涉及正则表达式,所以我不知道你在问什么。

相关问题