Как довольно простая модификация версии Радда,
/^x=(.+) and y=([^ ]+)(?: and (.*))?/
позволит вам использовать $ 1, $ 2 и $ 3 (?: Делает группу некаптируемой) и гарантирует, что строка начинается с "x =", а не для "not_x =", чтобы соответствовать
Если вы лучше знаете, какими будут значения x и y, это следует использовать для дальнейшего ужесточения регулярного выражения:
my @strs = ("x=1 and y=abc and z=c4g and w=v4l",
"x=yes and y=no",
"z=nox and w=noy",
"not-x=nox and y=present",
"x=yes and w='there is no and y=something arg here'");
foreach (@strs) {
if ($_ =~ /^x=(.+) and y=([^ ]+)(?: and (.*))?/) {
$x = $1;
$y = $2;
$remainder = $3;
print "x: {$x}; y: {$y}; remainder: {$remainder}\n";
} else {
print "$_ Failed.\n";
}
}
Выход:
x: {1}; y: {abc}; remainder: {z=c4g and w=v4l}
x: {yes}; y: {no}; remainder: {}
z=nox and w=noy Failed.
not-x=nox and y=present Failed.
x: {yes and w='there is no}; y: {something}; remainder: {}
Обратите внимание, что отсутствующая часть последнего теста связана с текущей версией y-теста, не требующей пробелов, если у x-теста было то же ограничение, что и в строке.