匹配被字符包围的单词,但不要匹配这些单词之间的单词



我正在尝试匹配这种字符串模式,其中包含由一对冒号包围的单词(每行都是一个单独的字符串(:

:foo::bar:
:foo:
:foo: :bar::test:
:foo: :bar: :test:

但我希望正则表达式在以下类型的模式上失败:

:foo:something:bar:
:foo:something
some :bar:
:foo: some:bar: thing
:foo: some :bar: thing

(注意,单词之间可能有0个或更多的空格(

我尝试使用这个正则表达式:

re = /^(:.*?: ?)+$/gm

但它在第二组示例中失败了(因为它匹配(。当冒号包围的单词之间或之前/之后有单词时,有没有办法以某种方式使正则表达式失败?

如果只有一个或多个单词字符w+,则可以在左右两侧的:之间重复匹配单词。

请注意,.也可以与您尝试的模式中的:相匹配。

^:w+:(?: *:w+:)*$

Regex演示

如果您不想匹配: : : :

^(?:: *[^:s]*[^:]*: *)+$
  • ^字符串开始
  • (?:非捕获组
    • : *[^:s]*匹配:可选空格,:以外的非空白字符
    • [^:]*: *然后可选地匹配除:之外的任何字符,然后匹配:
  • )+关闭非捕获组并重复1次以上
  • $字符串末尾

Regex演示

最新更新