Извлечь n-е вхождение с помощью Perl Regex - PullRequest
3 голосов
/ 19 декабря 2010

Я пытаюсь найти лучший способ разобрать строку, которая выглядит следующим образом:

<br> Explicit|00|11|Hello World|12 3 134||and|blah|blah|blah

Я просто хочу извлечь вещи между 6-й и 7-й вертикальной чертой |
Я пробовал что-то вроде

if ($line =~ /^(.*\|){6}(\w*)\|/ ) {  
    print $2;  
}

Проблема в том, что первая часть, кажется, соответствует самой длинной последовательности из-за .*, возможно, есть что-то другое, что я должен использовать Между вертикальными чертами есть буквенно-цифровые символы, пробелы и знаки пунктуации.

Должен ли я сопоставить самое короткое между ними?

Ответы [ 2 ]

8 голосов
/ 19 декабря 2010

Вместо этого вы можете использовать .*?, чтобы изменить * так, чтобы он предпочитал меньше или больше раз.

Это может все равно совпадать в неправильном месте, если в поле, которое вы хотите, есть несловарные символы;Чтобы предотвратить это, вы можете прямо сказать что-нибудь, но - |(([^|]*\|){6}) или отключите возврат для этой части (((?>.*?\|)){6}).

Или вы можете просто использовать split:

if ( my $seventh = ( split /\|/, $line, 8 )[6] ) {
    print $seventh;
}

(8 является необязательным и указывает разделение не беспокоить)пытаясь больше после достижения 7-го |)

3 голосов
/ 19 декабря 2010

Использовать сплит.Что-то вроде my @fields = split /\|/, $str должно работать.Затем вы просто индексируете интересующее вас поле (также сохраняются пустые поля)|должен быть экранирован как оператор регулярного выражения.

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