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



我正在尝试创建一个正则表达式,该表达式仅在字符串由某种模式的实例组成时才匹配。假设我只需要一个字符串由由空格分隔的"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的每个实例(即我的基本模式或捕获组(都应该在前面有一个空格或字符串的开头,并且应该以空格结尾,或者位于字符串的末尾。

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

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

(?:^|bars|foos)(foo|bar)(?=$|sbar|sfoo)

它不适用于"foofoo bar"(不知何故它是有效的(。

我正在Python中测试它。但如果它也在 JS 中工作,那就太好了。

你可以使用这样的模式

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

查看正则表达式演示 #1

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

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

查看正则表达式演示 #2

注意:

  • 如果你对尾随换行符匹配有问题,你需要调整字符串锚点的结尾(见我的这个答案(
  • 如果需要在条目之间允许任何 1+ 空格字符,请使用s+。如果空格不应与换行符匹配,请使用h+[p{Zs}t]+。如果条目之间只能有 1 个空格,则删除+
  • 要允许前导/尾随空格,请在^之后和$之前添加s*/h*/[p{Zs}t]*

最新更新