2015-11-13 2 views
3

У меня есть следующие строки:Perl регулярное выражение Чередование

Data 250 MB 
Data 1.5 GB 
Data 10 GB 

мне нужно, чтобы захватить только значения 250 MB, 1.5 GB, 10 GB. Так что я написал выражение

(my $data) = $str1 =~ /Data (\S+ GB|MB)/ or die "$str1\n";

Это работает для данных в Великобритании, но и для МБ, я получаю результат Data 250 MB. Может кто-нибудь объяснить, почему?

ответ

4

вы определили вашу группу захвата, как (\S+ GB|MB), которая соответствует \S+ GBилиMB (т.е. | применяется ко всей группе захвата).

Вы хотите либо:

  1. /Data (\S+ GB|\S+ MB)/
  2. /Data (\S+ (GB|MB))/, или даже лучше /Data (\S+ (?:GB|MB))/, используя группу без захвата.
0

Попробуйте с:

(my $data) = $str1 =~ /Data (\S+ [GM]B)/ or die "$str1\n"; 

Это будет соответствовать G B или M B

8

Оператор Чередование не работает на словах, это означает

(\S+ GB) or (MB) 

Добавить круглые скобки:

/Data (\S+ (?:GB|MB))/ 

который можно еще больше упростить с классом персонажа:

/Data (\S+ [GM]B)/ 
Смежные вопросы