Вы действительно не хотите использовать квантификатор *
в этом случае, и вы не хотите, чтобы эти квантификаторы были жадными. Хитрость в регулярном выражении состоит в том, чтобы описать шаблон как можно точнее.
Строка, которую вы хотите сопоставить, имеет:
- Некоторые без пробелов
- Некоторые пробелы
- повторить еще два раза
Как только вы описали ситуацию, вы можете перевести ее в регулярное выражение. Вы можете начать с буквального перевода вашего описания:
my @values = /(\S+) (\S+) (\S+)/;
Поскольку вы использовали \S
, части шаблона в перехвате не могут пройти через пробел, чтобы соответствовать больше, чем вы предполагали, как может .*
.
Вы повторили части шаблона, так что вы можете сжать это. Поскольку вы просто захватываете группы пробелов, сделайте это глобальным соответствием:
my @values = /(\S+)/g;
Вы также можете подумать об обратном. Вместо того, чтобы захватывать пустое пространство, вы можете выбросить пустое пространство с помощью split :
my @values = split /\s+/;