我正在VS Code中做一个语法扩展,我在正则表达式模式背后遇到了困难。给定下面的字符串,我只想在**@fmt()之前返回cmp**
@fmt(cmp,foo)
我在另一个编辑器中使用的匹配字符串是这样的:
(?<=[@|©](fmt)\()(\w+)
然而,这在VS Code中不起作用,当我进行正则表达式搜索时,它返回的错误是它不是一个有效的表达式。玩它,问题是**〈=**字符,它表示后面的样子。
搜索VS Code网站不会返回任何类型的正则表达式参考指南。搜索Stack Overflow得到了this question,这表明Visual Studio具有唯一的正则表达式定义。不幸的是,这个问题中给出的例子在VS Code中不起作用。
有谁知道如何在VS Code中查找regex后面的内容?或者至少知道VS Code的regex文档在哪里?
我担心这是不可能的,因为根据Stack Overflow参考,JavaScript不支持look behinds。还有一个问题展示了如何在JavaScript函数中模仿look behinds,但我不知道是否有可能用用户定义的函数在VS Code中扩展语言。如果有人知道如何做到这一点,并能为我指出这个方向,这也是一个可以接受的变通方法。
3条答案
按热度按时间baubqpgj1#
你 * 可以使用
infinite-width lookahead and lookbehind
*,而没有任何约束,现在从Visual Studio Code v开始。1.31.0版本。见证明:
另一个(使用
(?<=@fmt\([^()]*)\w+
模式,注意lookbehind中的*
):参见Github
[VSCode 1.31] ES2018 RegExp lookbehind assertions are now supported #68004
issue:由于移动到电子3。0、
RegExp
lookbehindAssert现在受支持,因为它们是从Chromium 62和Node 8开始受支持的。10.0和Electron 3。0使用Chromium 66和Node 10。2.0,所以现在支持它们,但是发行说明没有提到现在支持lookhindAssert。VS Code开发人员确认他们“忘记在发行说明中提到它”是真的。
**请注意,可变长度的查找Assert只在文件编辑器搜索中起作用,而在
Find in Files
搜索(放大镜图标)**中起作用。根据这个GitHub问题讨论编辑器中的搜索使用JS正则表达式引擎,跨文件搜索使用ripgrep,它不支持[可变长度的lookbehindAssert]。在regex特性支持方面有少量的差异,这是其中之一。
在
ripgrep
repo中查看这些已关闭的问题:lymnna712#
更新
Visual Studio Code v.1.31.0及更高版本支持regex lookbehind,请参阅Wiktor's answer**
Visual Studio代码使用ECMAScript 5中指定的JavaScript正则表达式,该表达式不支持look behinds(https://github.com/Microsoft/vscode/issues/8635)。
如果您正在执行查找和替换,这里有一个解决方案,您可以尝试(感谢cyborgx37):
搜索表达式:
(lookbehind_expression_)text_to_replace
替换表达式:
$1replacement_text
给定输入:
lookbehind_expression_text_to_replace
输出将是:
lookbehind_expression_replacement_text
ycggw6v23#
向前看和向后看都可以在VS Code中工作。下载一些现有的语言插件并查看它们的规则,以了解如何制定这些规则。以下是我的ANTLR语法扩展的一部分:
结束匹配使用后向模式。还请记住,您可以嵌套模式,i。即,您可以为更大结构(例如,例如,整个函数),然后将其部分与子模式匹配(并分配单个样式)。这就是为什么你通常不需要向前看/向后看,因为你知道你在某个代码块中。
对于上面的模式:
(\w+)
部分是否应该是lookbehind模式的一部分?如果是,则应在最后一个右括号之前。