regex - 设置 perl 正则表达式搜索从长字符串中的给定位置开始

标签 regex performance perl tokenize

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

我的问题是:如何有效地限制 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;

关于regex - 设置 perl 正则表达式搜索从长字符串中的给定位置开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65184933/

相关文章:

linux - 如何使用 unix 在 XML 文件中的特定标记之间添加或替换特定字段

javascript - 正则表达式在 CKeditor 的 HTML 中查找 png-gif-jpg 图像链接

Perl:安全的模板语言

java - 使用正则表达式查找字符串中至少一个重复字符

performance - 查找给定半径内的所有整数坐标

python - 在 Python 中通过谓词对可迭代对象进行分组

c# - 规范化真的会影响高流量站点的性能吗?

Perl打开: how to forward stderr to stdout?

复制 VBA Like 运算符所需的 C# 片段

php - 正则表达式匹配可能包含中文字符的字符串