正则表达式强制 star 给出至少一个字符,而它应该是 none

Regex forces star to give at least one character, while it should be none

我正在尝试为自定义语法文件创建一个正则表达式,以在使用 YAML 制作的 Sublime Text 2 中使用。我的语法有这种形式的命令,最多有 6 个参数:

#MY_COMMAND.argument01.argument02 with spaces and characters.arg03#

我想用不同的颜色为命令名称、点和参数着色,所以我想要一个选择不同组中所有内容的正则表达式,这样我就可以使用捕获在 YAML 文件中为它们着色。

我想到了这个:

/([^.]*)(.)([^.]*)(.)([^.]*)(.)([^.]*)(.)([^.]*)(.)([^.]*)(?=#)/

它几乎完全符合我的要求。只要命令具有最大参数(即 6)并且与我编写 ([^.]*).

的次数一样多,它就可以很好地工作

所以这很好用。但是当我使用较少的参数时,会发生一些奇怪的事情(对我来说,出乎意料)。最后几组,应该 return 什么都没有,每个都在字符串的末尾抓取一个字符,这使得最后一个参数的字符比预期的少一些。

显然我还不能分享图片,因为我刚刚创建了这个帐户,但是你可以检查问题here。在此示例中,您可以将鼠标悬停在文本上以查看组。在这种情况下,我希望第 7 组包含 foo,而我希望第 8 组及以上不包含任何内容。

如有任何帮助,我们将不胜感激。

将文字点与正则表达式匹配时应小心:要么将其转义到字符 class (\.) 之外,要么在字符 class ([.]).

要使正则表达式的某些部分可选,请使用带有 ? 量词的非捕获组。

因此,您可以使用以下正则表达式:

/^([^.]*)(?:\.([^.]*))?(?:\.([^.]*))?(?:\.([^.]*))?(?:\.([^.]*))?(?:\.([^.]*))?(?=#)/m

demo

请注意,在多行模式下,[^.] 可以 "overmatch" 跨行,因为它也匹配换行符。多行模式使 ^ 在一行的开头匹配。也许,你根本不需要多行模式,所以适当调整。