Как я могу найти подстроку в строке, используя Perl? - PullRequest
9 голосов
/ 08 декабря 2008

У меня есть строка, из которой я хочу извлечь одно слово, но с добавленным к нему числовым значением, которое может отличаться в каждой строке:

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;

Выше выводит всю строку, я хочу получить только строкуXXX

Ответы [ 4 ]

13 голосов
/ 08 декабря 2008

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

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

Пояснение:

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

edit: исправлен порядок захваченных чисел.

5 голосов
/ 08 декабря 2008

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

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

0 голосов
/ 09 декабря 2008

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

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

0 голосов
/ 08 декабря 2008

Просто измените print $ pattern на print $ &, который уже захвачен.

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