我正在尝试创建一个正则表达式,该表达式仅在字符串由某种模式的实例组成时才匹配。假设我只需要一个字符串由由空格分隔的"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]*
。