如何使用Perl在字符串中找到子字符串?

时间:2008-12-08 04:31:18

标签: regex perl substring

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

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 个答案:

答案 0 :(得分:13)

你需要抓住它:

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

说明:

  • 括号将其中的内容捕获到$ 1。如果你有一套以上的parens,那么第一套是1美元,第二套是2美元等等。在这种情况下,$ 2将有实际的数字。
  • \ d {1,2}可以捕获1到3位数字,允许您捕获0到99之间的数据。额外的100可以让您明确捕获100,因为它是您想要匹配的唯一3位数字。

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

答案 1 :(得分: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

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

答案 2 :(得分:-1)

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

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

答案 3 :(得分:-2)

只需将print $ pattern更改为打印$&amp;,已经捕获。