【问题标题】:set perl regular expression search start at a given position in a long string设置 perl 正则表达式搜索从长字符串中的给定位置开始
【发布时间】:2020-12-07 15:51:16
【问题描述】:

我想从可能很长的输入代码文本中提取简单回溯解析器的标记。我的设置是使用一个整数光标,它保存文本中的下一个读取位置,最初为 0。然后我想使用 substr 提取简单的短标记和 perlre 以获得更复杂的标记。因此,后续正则表达式搜索之间的光标位置可能会向前(在成功的标记子字符串匹配之后)或向后(在回溯时)跳跃。

我的问题是:如何有效地限制 perlregex 搜索的起始位置,以便它仅从该位置搜索匹配的标记。

例如,我想在示例文本中获取十进制数字标记

my $text = 'long text with 2 numbers 3928 in it';

当前光标位置是 25。我目前对这个问题的看法是生成一个(可能效率低下的长)子字符串

my $tail = substr $text, 25;
printf "%s\n",
    $tail =~ /^\d+/
    ? "match: $&"
    : "miss";

或通过(可能效率低下)额外的模式匹配来操作 \G 修饰符(请注意,25 必须是真实标记器中的变量)

$text =~ /.{25}/gcm;
printf "%s\n",
    $text =~ /\G\d+/
    ? "match: $&"
    : "miss";

后一种选择具有额外的外观弱点,即它可能不是线程安全的。这不是我现在正在做的事情的问题,但我也在我的问题中为那些可能使用多线程的人强调了这个问题。

【问题讨论】:

    标签: regex performance perl tokenize


    【解决方案1】:

    pos 是一个左值,可以赋值给。

    #!/usr/bin/perl
    use strict;
    use warnings;
    use feature qw{ say };
    
    my $text = 'long text with 2 numbers 3928 in it';
    
    pos($text) = 25;
    
    say for $text =~ /(\d+)/g;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多