正则表达式强制 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" 跨行,因为它也匹配换行符。多行模式使 ^
在一行的开头匹配。也许,你根本不需要多行模式,所以适当调整。
我正在尝试为自定义语法文件创建一个正则表达式,以在使用 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" 跨行,因为它也匹配换行符。多行模式使 ^
在一行的开头匹配。也许,你根本不需要多行模式,所以适当调整。