我正在为一种语言创建一个语法高亮文件,我已将所有内容都映射出来并使用了一个例外。
我无法想出一个符合特定行注释样式的以下条件的正则表达式。
如果第一个非空白字符是星号(*),则该行被视为注释。
我创建了许多在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
答案 0 :(得分: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)
将其取出并在编译正则表达式时指定该选项。