Регулярное выражение (/<(\w+)\s+(.*?)>/) нуждается в улучшении - PullRequest
0 голосов
/ 12 января 2010

Существует подпрограмма для обработки типа и значения.

sub parse_type_value_specifier { 
    my $tvs = shift; 
    my ($type, $value) = $tvs =~ /<(\w+)\s+(.*?)>/;
    return $type, $value; 
}

Это должно соответствовать трем форматам ниже.

<B 0> - works, return $type = (B) and $value = (0)
<A[1..80] ""> - doesn't work, need return $type = A[1..80] and $value = () # empty
<A[1..80] "hello"> - doesn't work. need return $type = A[1..80] and $value = (hello)

/<(\w+)\s+(.*?)>/ Спасибо.

Ответы [ 6 ]

3 голосов
/ 12 января 2010

Как насчет

/<([\w\[\].]+)\s*"?([^">]*)"?>/

или /<(\w+)\s*"?([^">]*)"?>/, если ваш A [1..80] означает \ w длина от 1 до 80

2 голосов
/ 12 января 2010

Следующее «работает» для ввода, которое вы показываете, но вы должны предоставить более полную спецификацию:

#!/usr/bin/perl

use strict; use warnings;

while ( <DATA> ) {
    if ( my ($type, $value) = /^<([A-Z])(?:\[.+\])?\s+"?(\w*)"?>/ ) {
        print "\$type = $type\t\$value = $value\n";
    }
}

__DATA__
<B 0>
<A[1..80] "">
<A[1..80] "hello">

Выход:

$type = B       $value = 0
$type = A       $value =
$type = A       $value = hello
2 голосов
/ 12 января 2010

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

/<(\w{1,80})\s*(?:\s([^\s">]+|"[^"]*"))?>/

Теперь, если совпадение второй группировки начинается с ", удалите его из начала и конца, и у вас будет простое значение.

1 голос
/ 12 января 2010

Ваше регулярное выражение верно на 99%, проблема в том, что \w не будет соответствовать буквальным квадратным скобкам []. просто переделайте \ w с подходящим классом символов [\w\[\]\.]+

<([\w\[\]\.]+)\s+(.*?)>
1 голос
/ 12 января 2010

Попробуйте это

<(.+) +"?(.*?)"?>
1 голос
/ 12 января 2010

Похоже, вы хотите игнорировать " с. Запустите его через другое регулярное выражение, чтобы убрать их первым.

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