Как я могу сопоставить смешанные пробелы и () в Perl? - PullRequest
0 голосов
/ 21 января 2010

Как мне улучшить регулярное выражение Perl для обработки __DATA__ ниже?

my ($type, $value) =~ /<(\w+)\s+(.*?)\(\)>/;  

__DATA__
<dynamic DynamicVar>
<dynamic DynamicVar > # not need attache the blackspace to $value when return
<dynamic DynamicFun()>
<dynamic DynamicFun() > # not need attache the blackspace to $value when return

Я хочу вернуть $type и $value как этот формат <$type $value>.

Ответы [ 3 ]

7 голосов
/ 21 января 2010

Вместо того, чтобы беспокоиться о деталях содержимого, просто сопоставьте что-либо в скобках.

my($type, $value) = m{< (\w+) \s+ (.*?) \s* >}x;

.*? означает совпадение с чем-либо не жадным , что означает, что оно будет искать первое сопоставляемое, а не самое длинное Это означает, что он не будет убирать пробелы в конце, он оставит его на \s*. Это также означает, что <foo bar> and then a >.

не будет обманут
4 голосов
/ 21 января 2010

вы получили свой ответ, но вот другой способ, с меньшим регулярным выражением.

while(<DATA>){
    chomp;
    s/[<>]//g;
    my ($type, $value) = split /\s+/ ;
    print "type: $type\n";
    print "value: $value\n";
}
1 голос
/ 21 января 2010

Попробуйте это регулярное выражение:

/<(\w+)\s+(.*?)(?:\s*\(\)\s*)?>/

Но я бы также заменил .*? на что-то более конкретное. Если вы просто ожидаете словосочетания, вы также можете использовать \w+ здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...