【问题标题】:Return a word in a visual-studio-code extension在视觉工作室代码扩展中返回一个单词
【发布时间】:2020-02-29 19:38:59
【问题描述】:

我正在 typescript 中的 visual-studio-code 中进行扩展。 而且我需要在 '{{>' 前缀之后返回一个单词(结合点和连字符)。

{{>word-test }}
{{> word-test}}
{{> word-test }}
{{> word-test class="class_name"}}
// returns 'word-test'

// On this one the regex doesn't seem to work
{{> word-test 
    class="class_name"
}}
// returns all the text in the file

{{> word-test.test }}
// returns 'word-test.test'

为了获取单词,我使用了 Visual-studio-code 中内置的 'getWordRangeAtPosition',参数中带有正则表达式。

问题

我尝试了一些正则表达式组合,但是当出现换行符时,我永远不会在 visual-studio-code 中返回“word-test”。 相反,我得到了文件中的所有文本。

这是我尝试过的最新正则表达式组合:

/(?<={{>[ \s]{0,1})(.*?)(?=[\n\s\}\}])/

在正则表达式测试器中一切正常,但在视觉工作室代码本身中却不行。

查看正则表达式测试器:https://regexr.com/4o4d8

【问题讨论】:

  • 一些 cmets:1) 空间已经包含在 \s{0,1}?,然后是 [ \s]{0,1} \s? 2) 字符类中的两个相同字符不'没有意义,(?=[\n\s\}\}]) [\s}]+ 3) 许多浏览器(例如Firefox)不支持lookbehind
  • 你的意思是像(?&lt;={{&gt;\s*)\w+(?:[.-]\w+)*(?=[\s\S]*?}})regex101.com/r/AxRVG9/1
  • doc 说:“自定义正则表达式将无法匹配多行字符串,并且以速度正则表达式的名义不应匹配带有空格的单词。使用 TextLine。用于更复杂、不冗长的场景的文本。”所以你得到的是预期的行为。您需要使用 TextLine.text。

标签: javascript regex typescript vscode-extensions


【解决方案1】:

除了复杂的正则表达式,你能把逻辑写在你的扩展代码里吗?

可以在位置上找到单词,然后从文档的同一行获取前导文本,并测试前导文本是否以{{&gt;结尾:

let wordRange = document.getWordRangeAtPosition(position, /\w[-\w\.]*/g);
let leadingText = document.getText(new Range(wordRange.start.with({ character: 0 }), wordRange.start));
let hasCorrectPrefix = leadingText.match(/{{>\s?$/);

如果功能确实需要,您也可以比较后缀。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 2017-04-01
    • 2015-07-10
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多