【问题标题】:How can I identify the "tokens" (wrong word) of a regular expression如何识别正则表达式的“标记”(错误的单词)
【发布时间】:2010-05-11 04:01:18
【问题描述】:

我正在使用 Perl 开发一个相当专业的搜索引擎实现,它(通过正则表达式)从文本文件中搜索特定分隔(:punct:) 字符串的文档。我正在做通常的搜索引擎索引技巧,但是有一个问题。

某些搜索正则表达式模式必然包括文件中使用的分隔符。 “好吧,我对自己说,“单词接近,然后……很容易”……等式的那一边就足够直截了当了。

诀窍在于,因为搜索模式是正则表达式,所以我无法轻松确定应该在索引数据中查找的特定单词(如果我们谈论的是更普通的字符串,请考虑“拆分”)。

简单的例子,“square[\s-]*dance”将直接匹配“squaredance”,但匹配“square dance”和“square-dance”(因为'-'是一个分隔符)。我需要知道,根据正则表达式,分别寻找“广场”和“舞蹈”,但彼此靠近。

我喜欢挑战,但我更愿意使用已建立的代码。我的直觉告诉我,这将是正则表达式引擎的内部挂钩,但我不知道这样的事情。有什么建议吗?

【问题讨论】:

  • 搜索模式可以任意复杂吗?如果您要花时间建立索引,何不解码您的存储格式并搜索您关心的位?

标签: regex perl search-engine


【解决方案1】:

re pragma 可以生成您似乎感兴趣的信息。

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)

【讨论】:

  • 太糟糕了,它需要重定向 STDERR 来获取数据,但这是一个了不起的解决方案。谢谢!
猜你喜欢
  • 2014-12-20
  • 2022-07-12
  • 2023-02-03
  • 2023-01-16
  • 2015-03-23
  • 2013-07-25
  • 1970-01-01
  • 2018-06-23
  • 2012-03-01
相关资源
最近更新 更多