如何在perl中的关键字之前或之后搜索字母数字?

时间:2012-10-02 03:35:03

标签: regex perl

我的句子如下例所示:

$sen1 = "The quick brown fox jump KEYWORD over123 the3 lazy dog, fox is quick";

$sen2 = "The quick brown fox jump123 KEYWORD over the lazy dog, fox is quick"; 

我想使用关键字“KEYWORD”作为我的搜索字符串,使用Perl正则表达式在搜索字符串之前和之后提取字母数字字。

示例输出:

over123

jump123

注意:'the3'这个词被省略了,因为我只是在'KEYWORD'之前或之后搜索字母数字。

谢谢

3 个答案:

答案 0 :(得分:1)

您可以使用命名捕获方法,这样如果只有一个案例,您就不需要检查$ 1或$ 2。 (?<before>[\w\d]+)?\s*KEYWORD\s*(?<after>[\w\d]+)?

my $str = <<DAT;
The quick brown fox jump KEYWORD over123 the3 lazy dog, fox is quick
The quick brown fox jump123 KEYWORD over the lazy dog, fox is quick
The quick brown fox jump123 KEYWORD over123 the lazy dog, fox is quick
The quick brown fox jump123KEYWORDover123 the lazy dog, fox is quick
DAT

foreach (split(/\n/,$str)){
    if(/(?<before>[\w]+)?\s*KEYWORD\s*(?<after>[\w]+)?/){
        print $+{before} . "-" . $+{after} . "\n";
    }
}

答案 1 :(得分:1)

鉴于你的关键字只在字符串中出现一次,你可以使用:

my $string = 'The quick brown fox jumps123 KEYWORD over the lazy dog';

my ( $w_before, $w_after ) = $string =~ m/(\w+)\s*KEYWORD\s*(\w+)/;
# $w_before == jumps123
# $w_after == over

我假设,当你说字母数字时,你的意思是它是字母或数字或两者的组合。在这种情况下,\w可以做到这一点。我还放了\s*,以防KEYWORD和前/后单词之间有空格。

使用我所写的内容,它可以捕获'blah'和'foo'中的单词:

blahKEYWORDfoo
blah KEYWORD foo
blahKEYWORD foo
blah KEYWORDfoo
blah          KEYWORD      foo

答案 2 :(得分:0)

假设您对这两个目标没有更严格的要求,但它至少由一个单词或数字组成,如

([\w\d]+)\s+KEYWORD\s+([\w\d]+)

在这两种情况下都应该做到;这将在$ 1中给你这个单词,在$ 2中给你单词。