我正在努力解决以下问题:
我需要能够匹配以下两个字符串:
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”
)请告知。
谢谢!
答案 0 :(得分:1)
在可选部分内放置空格,并使星星变不贪心:
create (\d+) users prefixed with "(.*?)"(?: by username "(.*?)")?
您面临的问题是,第一个(贪婪的)捕获会吞噬从第一个引号到最后一个引号的所有内容,从而使不需要此可选内容成为可能。切换到非贪婪量词,可以使用户名合理。另一种方法是显式排除分隔符:
create (\d+) users prefixed with "([^"]*)"(?: by username "([^"]*)")?