2

我正在为一种语言创建一个语法高亮文件,并且我已将所有内容都映射出来并处理一个例外。

我无法想出一个匹配特定行注释样式的以下条件的正则表达式。

如果第一个非空白字符是星号 (*),则该行被视为注释。

我创建了许多在 regexr 中工作的示例,但它从未在 vscode 中捕获。

例如,正则表达式很酷: ^(?:\s*)\*+(?:.*)?\n

因此,我将其转换为 tmlanguage.json 文件的正确格式: ^(?:\\s*)\\*+(?:.*)?\\n

但它没有正确捕获,如果该行的第一个字符是 *,它不会捕获,但如果第一个字符是空格字符后跟一个 *,它确实有效。

我在stackoverflow上的格式很烂,所以代表一个chr(9)制表符。是一个空间。

*******************************
  *****************************
<tab>*************************
* comment
  * comment
<tab>* comment

But it shouldn't work in these cases:
string *******************************
  string ***************************** string
<tab>string *************************
x *= 3

我猜要么锚 ^ 在我的正则表达式中不起作用,要么我错误地转义了一些东西。

有什么建议吗?

请参阅随附的示例图片:屏幕截图

4

2 回答 2

1

我不知道您正在使用的正则表达式引擎。我只是给你一些
关于如何做的一般提示。

  • 首先,如果您正在读取一个包含超过 1 个换行符的字符串,则处于引擎默认状态
    的 anchor表示字符串开头(BOS) ^

在这种情况下,您想要的是Multi-Line-Mode。这使得锚点在行(BO L) 以及 BOS ^处匹配。

  • 其次,您不需要那些非捕获组(?:\s*) (?:.*),它们封装了单个构造。

  • 第三,当其包含的内容是可选的时,使一个组成为可选是多余的(?:.*)?

  • 第四,最后不需要换行符\n结构,因为它不应该被突出显示,而且它可能不会出现在文本的最后一行。
    后者会使它不匹配。


所以,把它们放在一起,修改后的正则表达式将是(?m)^\s*\*.*

解释

 (?m)     # Inline modifier: Multi-line mode
 ^        # Beginning of line
 \s*      # Optional many whitespace
 \*       # Required at least a single asterisk
 .*       # Optional rest of non-newline characters


请注意,如果您需要在替换中引用它,您可以在数据周围放置一个捕获组(?m)^(\s*\*.*)

此外,您使用的语言应该可以在编译正则表达式时指定选项。如果引擎不接受内联修饰符(?m),则在编译正则表达式时将其取出并指定该选项。

于 2017-08-27T01:38:00.607 回答
0

显然 VS Code 的语法高亮是单行的。无论我如何尝试匹配超过几行的regec,这些都不起作用。

其次,如果您正在设计一种语言,我建议您不要使用算术运算符进行注释。

第三,显然您可以在beginandend属性中匹配换行符。你可以在那里试试。

于 2021-09-26T18:22:00.757 回答