我在不同的文件中有几个函数,它们通常是这样的:"prefix":"functionName (...)"
,就像pub:isInt
。我想把函数的第一个字母大写,所以我做了这个正则表达式来改变为pub:IsInt
(这也拒绝了其他非故意的匹配,这就是为什么它是这样的):
匹配:([a-z]+):([a-z])([a-z \t_:]*)?(?=\()
更换:$1:\U$2$3
这对于一个函数很好,问题是当我在同一行中有多个函数时,比如:
pv:collect(table | pv:hasElement(table) AND pv:element(table))
字符串
在多个文件中搜索和替换可以执行以下操作:
pv:Collect(table | pv:Collect(table) AND pv:Collect(table))
型
这是错误的,因为$1
,$2
和$3
只匹配整行的第一个。
在一个文件中搜索和替换可以正确执行以下操作:
pv:Collect(table | pv:HasElement(table) AND pv:Element(table))
型
我认为问题出在lookahead((?=\()
)的解析问题上。因为如果我做同样的事情,但是删除lookahead并进行贪婪匹配*?
,它对所有文件和文件内部都有效。([a-z]+):([a-z])([\w \t_:]*?\()
2条答案
按热度按时间dluptydi1#
这看起来像是VSCode中的一个实际错误
我创建了一个问题:https://github.com/microsoft/vscode/issues/196592
的数据
尝试使用regex而不使用lookahead:
字符串
xtupzzrd2#
你的正则表达式会比你想象的匹配得更多,参见regex101 demo。
VS Code也会产生2个匹配如果您启用
MatchCase
选项-否则它会将您的[a-z]
视为[a-zA-Z]
。也许你可以在正则表达式的开头使用
^
,比如:字符串
您可以看到我添加了
A-Z
,因此您不需要MatchCase
选项。我觉得你真正想要的是
型
我把
|()
添加到你的字符类中。我使用了\w
,所以它可以处理小写和大写字符。请参阅regex101 demo,并在vscode中测试。