设置 perl 正则表达式搜索从长字符串中的给定位置开始
set perl regular expression search start at a given position in a long string
我想从可能很长的输入代码文本中为简单的回溯解析器提取标记。我的设置是使用一个整数游标,它保存文本中的下一个阅读位置,最初为 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";
后一种选择具有额外的外观缺陷,即它可能不是线程安全的。这对我现在正在做的事情来说没有问题,但我也在我的问题中强调了这个问题,供那些可能使用多线程的人使用。
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;
我想从可能很长的输入代码文本中为简单的回溯解析器提取标记。我的设置是使用一个整数游标,它保存文本中的下一个阅读位置,最初为 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";
后一种选择具有额外的外观缺陷,即它可能不是线程安全的。这对我现在正在做的事情来说没有问题,但我也在我的问题中强调了这个问题,供那些可能使用多线程的人使用。
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;