假设我有一堆代码,格式像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,
我想捕获信号名称,如aaa
、bbb
... 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
个
2条答案
按热度按时间ej83mcc01#
若要在句子中查找单词
apple
pear
books
word
air
或wires
:11苹果梨banan 0丝_工m$oney &&书丝字空气22
您可以使用lookarounds和
\v
来实现非常神奇的模式说明
\v
非常神奇模式\S@<!
负lookbehind,向左Assert一个空白边界(wire\S@!)
负lookahead,Assert不是单词wire
直接到右边,后面是空白边界[a-z$%]+
匹配字符类中列出的一个或多个字符\S@!
负lookahead,在右侧Assert空白边界您可以扩展此机制,以匹配问题第一部分中的输入/输出示例。
请注意,要查看所附图像中的突出显示,可以运行
:set hls
pdtvr36n2#
似乎做你想做的(或者至少我认为你想做的):
至于你的问题:
但是有没有通用的方法来过滤掉vim正则表达式中的某些字符串或某些模式?
你的例子似乎根本没有涉及正则表达式,所以我不知道你在问什么。