2010-05-10 68 views
8

我工作在Perl相当专门的搜索引擎实现的“令牌”(错一个字),它会搜索(通过正则表达式)的文件明确界定(的一个子集:PUNCT: )来自文本文件的字符串。我正在做通常的搜索引擎索引技巧,但有一个问题。我怎样才能识别正则表达式

某些搜索正则表达式模式包括,必然的,文件中使用的分隔符。 “好吧,我想对自己说,‘字接近,那么......很容易’......和方程的那一边是直线前进足够了。

诀窍是,由于搜索模式是正则表达式,我的天堂不容易确定我应该在索引数据中寻找的具体单词(如果我们正在谈论更普通的字符串,请考虑“分割”)。

简单示例,“square [\ s - ] * dance”将直接匹配“方块舞”,但“广场舞”和“方块舞”的接近匹配(因为“ - ”是分隔符),我需要知道,基于正则表达式,寻找“广场”和“。舞蹈”分开,但彼此邻近。

我游戏的challe nge,但我宁愿使用已建立的代码。我的直觉告诉我,这将是一个正则表达式引擎的内部钩子,但我不知道这样的事情。有什么建议么?

+0

搜索模式可以任意复杂?如果您花时间构建索引,为何不解码存储格式并搜索您关心的位? – 2010-05-10 19:51:19

回答

4

re编译可以产生你的信息似乎是有意

use strict; 
use warnings; 
use re qw(Debug DUMP); 

my $re = qr/square[\s-]*dance/; 

'Let\'s go to the square dance!' =~ $re; 

输出:

Compiling REx "square[\s-]*dance" 
Final program: 
    1: EXACT <square> (4) 
    4: STAR (17) 
    5: ANYOF[\11\12\14\15 \-][+utf8::IsSpacePerl] (0) 
    17: EXACT <dance> (20) 
    20: END (0) 
anchored "square" at 0 floating "dance" at 6..2147483647 (checking anchored) minlen 11 
Freeing REx: "square[\s-]*dance" 

遗憾的是,似乎没有成为一个纲领性钩来获取这些信息。你必须拦截STDERR上的输出并解析它。粗糙验证的概念:

sub build_regexp { 
    my $string = shift; 
    my $dump; 

    # save off STDERR and redirect to scalar 
    open my $stderr, '>&', STDERR or die "Can't dup STDERR"; 
    close STDERR; 
    open STDERR, '>', \$dump or die; 

    # Compile regexp, capturing DUMP output in $dump 
    my $re = do { 
     use re qw(Debug DUMP); 
     qr/$string/; 
    }; 

    # Restore STDERR 
    close STDERR; 
    open STDERR, '>&', $stderr or die "Can't restore STDERR"; 

    # Parse DUMP output 
    my @atoms = grep { /EXACT/ } split("\n", $dump); 

    return $re, @atoms; 
} 

使用这种方式:

my ($re, @atoms) = build_regexp('square[\s-]*dance'); 

$re包含模式,@atoms包含模式的文字部分的清单。在这种情况下,这是

1: EXACT <square> (4) 
    17: EXACT <dance> (20) 
+0

对于需要重定向STDERR来获取数据太糟糕了,但这是一个非常棒的解决方案。谢谢! – Trueblood 2010-05-10 20:31:50

相关问题