语言语法突出显示 - 注释行以*开头可能有也可能没有以下单词

时间:2017-08-27 00:33:47

标签: regex visual-studio-code textmate tmlanguage

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

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

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

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

例如,regexr很酷: ^(?:\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

我猜测锚点^在我的正则表达式中不起作用,或者我错误地逃避了。

有什么建议吗?

请参阅随附的示例图片:screenshot

1 个答案:

答案 0 :(得分:1)

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

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

在这种情况下,你想要的是多线模式。这使得锚点^匹配 行首 (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)将其取出并在编译正则表达式时指定该选项。