9

我有一个字符串,我希望从中提取一个单词,但附加了一个数字,每行可能不同:

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

4

4 回答 4

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 位数字。

编辑:修复了捕获的数字的顺序。

于 2008-12-08T04:39:10.220 回答
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

注意输出之间的差异。什么更可取取决于您的需求。

于 2008-12-08T05:33:05.040 回答
-1

不要过度指定。要捕获数字部分,只需使用 (\d+) 。这将捕获任意长度的数字,以便有一天当为您提供此文件的猴子决定将其范围扩大到 999 时,您将被覆盖。现在写的时候和以后维护的时候也很少考虑。

对你发出的东西要严格,但对你接受的东西要自由。

于 2008-12-09T17:51:18.090 回答
-2

只需将 print $pattern 更改为 print $&,它已经被捕获。

于 2008-12-08T05:21:20.180 回答