用简明英语列出的项目的正则表达式

cod*_*ker 7 java regex

这是一个人为的例子,但我试图在这里得出一般原则.

给定使用此类列表形式的英语短语:

I have a cat
I have a cat and a dog
I have a cat, a dog, and a guinea pig
I have a cat, a dog, a guinea pig, and a snake
Run Code Online (Sandbox Code Playgroud)

我可以使用正则表达式获取所有项目,无论有多少项目?请注意,项目可能包含多个单词.

显然,如果我只有一个,那么我可以使用I have a (.+),如果有两个,那么就可以了I have a (.+) and a (.+).

但是,如果我想要匹配的不仅仅是一个例子,事情会变得更加复杂.如果我想从两个例子提取列表中的项目,我想这会工作:I have a (.*)(?: and a (.*))?虽然这部作品的第一阶段,告诉我,我有一个catnull,为第二个它告诉我,我有一个cat and a dognull.当我尝试以更多形式匹配短语时,事情变得更糟.

有什么方法可以为此目的使用正则表达式吗?这似乎相当简单,我不明白为什么我的正则表达式匹配2项目列表工作,但匹配1-或2项目列表的正则表达不起作用.

alf*_*sin 1

您可以使用非捕获组作为条件分隔符(逗号或行尾):
' a (.*?)(?:,|$)'

python 中的示例:

import re
line = 'I have a cat, a dog, a guinea pig, and a snake'
mat = re.findall(r' a (.*?)(?:,|$)', line)
print mat # ['cat', 'dog', 'guinea pig', 'snake']
Run Code Online (Sandbox Code Playgroud)