正则表达式-需要建议

时间:2019-08-21 08:02:04

标签: regex

我正在努力解决以下问题:

我需要能够匹配以下两个字符串:

create 3 users prefixed with "user" by username "admin"
create 3 users prefixed with "user"

我得出的最接近的正则表达式是:

create (\d+) users prefixed with "(.*)" (?:by username "(.*)")?

因此,第一个字符串被匹配,但是第二个字符串没有匹配,这显然是由于可选部分之前的空格。

我尝试了更多的变化方式,例如:

create (\d+) users prefixed with "(.*)" ?(?:by username "(.*)")?
create (\d+) users prefixed with "(.*)"\s?(?:by username "(.*)")?
create (\d+) users prefixed with "(.*)" *(?:by username "(.*)")?
create (\d+) users prefixed with "(.*)"\s*(?:by username "(.*)")?

但是他们都没有帮助,因为检测到第一个字符串的第二组为: user”(用户名为“ admin”

请告知。

谢谢!

1 个答案:

答案 0 :(得分:1)

在可选部分内放置空格,并使星星变不贪心:

create (\d+) users prefixed with "(.*?)"(?: by username "(.*?)")?

您面临的问题是,第一个(贪婪的)捕获会吞噬从第一个引号到最后一个引号的所有内容,从而使不需要此可选内容成为可能。切换到非贪婪量词,可以使用户名合理。另一种方法是显式排除分隔符:

create (\d+) users prefixed with "([^"]*)"(?: by username "([^"]*)")?
相关问题