正则表达式:验证字符串仅包含模式实例

时间:2019-12-06 09:45:05

标签: regex

我试图创建一个仅在字符串包含某种模式实例时才匹配的正则表达式。假设我只需要一个字符串,该字符串由用空格分隔的“ foo”或“ bar”子字符串组成。

因此,有效的实例为:“ foo”,“ bar”,“ foo foo”,“ foo bar”,“ foo foo bar”,“ foo bar foo bar” ... 无效的实例:“ foofoo bar”,“ baz foo bar”,“ foo bar baz”

因此,foo或bar的每个实例(即我的基本模式或捕获组)都应在其前面加上一个空格或在字符串的开头,并且应以一个空格结尾或位于字符串的结尾。

这似乎是一项简单的任务,但我无法弄清楚。

这是我到目前为止得到的:

(?:^|bar\s|foo\s)(foo|bar)(?=$|\sbar|\sfoo)

它在“ foofoo bar”上不起作用(某种程度上有效)。

我正在用Python测试它。但是,如果它也可以在JS中使用,那就太好了。

1 个答案:

答案 0 :(得分:1)

您可以使用类似的模式

^(?:foo|bar)(?: (?:foo|bar))*$

请参见regex demo #1

如果您的正则表达式引擎支持递归模式,则可以使用

^(?<id>foo|bar)(?: (?&id))*$

请参见regex demo #2

注意:

  • 如果在结尾的换行符匹配方面存在问题,则需要调整字符串锚点的结尾(请参见this answer of mine
  • 如果需要在条目之间允许任何1个以上的空格字符,请使用\s+。如果空格不匹配换行符,请使用\h+[\p{Zs}\t]+。如果条目之间只有1个空格,请删除+
  • 要允许前导/尾随空格,请在\s*之后和\h*之前添加[\p{Zs}\t]* / ^ / $