0

我的句子如下例所示:

$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 正则表达式在搜索字符串之前和之后提取字母数字单词。

样本输出:

超过123

跳转123

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

谢谢

4

3 回答 3

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*了以防万一关键字和前后单词之间有空格。

使用我写的,它可以捕获单词“blah”和“foo”:

blahKEYWORDfoo
blah KEYWORD foo
blahKEYWORD foo
blah KEYWORDfoo
blah          KEYWORD      foo
于 2012-10-23T16:00:15.897 回答
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";
    }
}
于 2012-10-02T04:11:53.857 回答
0

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

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

在这两种情况下都应该这样做;这会给你1美元之前的单词,2美元之后的单词。

于 2012-10-02T03:58:11.400 回答