regex 在VSCode中的所有文件中搜索和替换与在文件中搜索和替换的行为不同

kkih6yb8  于 7个月前  发布在  Vscode
关注(0)|答案(2)|浏览(86)

我在不同的文件中有几个函数,它们通常是这样的:"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_:]*?\()

dluptydi

dluptydi1#

这看起来像是VSCode中的一个实际错误
我创建了一个问题:https://github.com/microsoft/vscode/issues/196592


的数据
尝试使用regex而不使用lookahead:

([a-z]+):([a-z])([a-z \t_:]*)?\(
$1:\U$2$3(

字符串

xtupzzrd

xtupzzrd2#

你的正则表达式会比你想象的匹配得更多,参见regex101 demo
VS Code也会产生2个匹配如果您启用MatchCase选项-否则它会将您的[a-z]视为[a-zA-Z]
也许你可以在正则表达式的开头使用^,比如:

^([a-z]+):([a-z])([a-zA-Z \t_:]*)?(?=\()    // need for the MatchCase option

字符串
您可以看到我添加了A-Z,因此您不需要MatchCase选项。
我觉得你真正想要的是

([a-z]+):([a-z])([\w \t_:|()]*)(?=\()


我把|()添加到你的字符类中。我使用了\w,所以它可以处理小写和大写字符。请参阅regex101 demo,并在vscode中测试。

相关问题