2008-12-08 7 views
9

У меня есть строка, из которой я желаю, чтобы извлечь одно слово, но с численным приложенным к ней, которые могут быть разными в каждой строке:Как найти подстроку внутри строки с помощью Perl?

This is string1 this is string 
This is string11 
This is string6 and it is in this line 

Я хочу, чтобы разобрать этот файл и получить значение из "stringXXX", начиная от 0 до 100

# suppose ABC.txt contains the above lines 
FH1 = open "Abc.txt"; 
@abcFile = <FH1>; 

foreach $line(@abcFile) { 
    if ($pattern =~ s/string.(d{0}d{100}); 
     print $pattern; 

Вышеприведенные печатает все строки, я хотел бы получить только stringXXX

ответ

13

вам нужно захватить его:

while ($pattern =~/(string(100|\d{1,2}))/g) { 
    print $1; 
} 

Объяснение:

  • круглые скобки захвата, что в них в $ 1. Если у вас есть несколько наборов парен, первый захват составляет $ 1, второй - $ 2 и т. Д. В этом случае $ 2 будет иметь фактическое число.
  • \ d {1,2} захватывает от 1 до 3 цифр, что позволяет вам снимать между 0 и 99. Дополнительные 100 позволяют вам фиксировать 100 явно, так как это единственное 3-значное число, которое вы хотите сопоставить.

изменить: зафиксировано количество зафиксированных чисел.

+0

спасибо, что помогло :-) – gagneet 2008-12-08 05:31:07

+0

if // -> while // g – jfs 2008-12-08 05:35:28

+0

Thanks @ J.F. Я обновил ответ – 2008-12-08 07:10:32

-2

Просто измените шрифт $ pattern для печати $ &, который уже захвачен.

5

Abc.pl:

#!/usr/bin/perl -w  
while(<>) { 
    while (/(string(\d{1,3}))/g) {  
    print "$1\n" if $2 <= 100; 
    } 
} 

Пример:

$ cat Abc.txt 
This is string1 this is string 
This is string11 
This is string6 and it is in this line 
string1 asdfa string2 
string101 string3 string100 string1000 
string9999 string001 string0001 

$ perl Abc.pl Abc.txt 
string1 
string11 
string6 
string1 
string2 
string3 
string100 
string100 
string001 
string000 

$ perl -nE"say $1 while /(string(?:100|\d{1,2}(?!\d)))/g" Abc.txt 
string1 
string11 
string6 
string1 
string2 
string3 
string100 
string100 

Обратите внимание на разницу между выходами. Что предпочтительнее, зависит от ваших потребностей.

-1

Не указывайте. Чтобы захватить числовую часть, просто используйте (\ d +). Это приведет к захвату нескольких длин, так что когда-нибудь, когда обезьяны, которые предоставляют вам этот файл, решили расширить свой диапазон до 999, вы будете охвачены. Это также меньше мысли, как сейчас, когда вы пишете, а позже, когда вы поддерживаете.

Будьте строгими в том, что вы испускаете, но будьте либеральными в том, что вы принимаете.