确定与 perl 中的正则表达式匹配的部分

2024-01-25

我正在寻找正则表达式可能重叠的匹配的累积(最终目标是在结果子字符串中进行进一步搜索)。

我想跳过已经“累积”的匹配,同时避免使用substr(我可能是错误的避免substr),但是我为它写的条件是pos($...) = ... and a next if $... =~ /.../不起作用:

#!/usr/bin/env perl

# user inputs
$regexp = "abc|cba|b";
$string = "_abcbabc_bacba";

$length = length($string);
$result = "0" x $length;

while ( pos($string) < $length and $string =~ /$regexp/go ) {
    pos($string) = $-[0] + 1;
    next unless ($len = $+[0] - $-[0]);

#   The failing condition is here:
#    pos($result) = $-[0];
#    next if $result =~ /1{$len}/;

    substr($result, $-[0], $len) = "1" x $len;

    printf "%s\n", $string;
    printf "%".$-[0]."s%s\n", "", "^" x $len;
}
printf "%s\n", $result;

通过评论这些行我可以获得所需的结果01111111010111:

_abcbabc_bacba
 ^^^
_abcbabc_bacba
  ^
_abcbabc_bacba
   ^^^
_abcbabc_bacba
    ^
_abcbabc_bacba
     ^^^
_abcbabc_bacba
      ^
_abcbabc_bacba
         ^
_abcbabc_bacba
           ^^^
_abcbabc_bacba
            ^
01111111010111

但我的预期输出(在工作条件下)将是:

_abcbabc_bacba
 ^^^
_abcbabc_bacba
   ^^^
_abcbabc_bacba
     ^^^
_abcbabc_bacba
         ^
_abcbabc_bacba
           ^^^
01111111010111

notes:

  • 对于每次迭代,我都会打印原始字符串;这^下面显示了当前迭代中已匹配的字符。

  • the 0 & 1最后代表总体结果。在此过程中至少匹配过一次的字符被设置为1.

  • 我的注释条件是当其对应的字符已设置为时跳过当前匹配1在结果中。


我想你真的想找到最长的重叠子匹配。如果您可以保证交替中的子字符串按照您喜欢的顺序排列,那么这种方法可能会起作用,但它还需要了解除了匹配之外以及未来匹配中发生的情况。也就是说,在获得可能重叠的未来匹配之前,您不知道是否可以输出任何内容,并且您无法判断需要查看多远的未来。

你可以乱搞pos,但我想我只是分别匹配每个子字符串,记住起始位置,然后进行比较。将问题分解为单独的任务,以查找匹配的位置并确定您想要的位置。

即使我编写了与您提供的相同的代码,如果我在长时间缺席后再次看到它(即使我确实突出显示了它),我也不太可能记住必须发生的所有事情以使一切顺利进行@- and @+在第一章中掌握 Perl https://www.masteringperl.org ;)

use v5.10;
use strict;

my $target      = "_abcbabc_bacba";
my @looking_for = qw( abc cba b );

my @found;

foreach my $want ( @looking_for ) {
    my $pos = 0;
    while( my $found_at = index $target, $want, $pos ) {
        last if $found_at == -1;
        push @found, $found_at;
        $pos = $found_at + 1;
        }
    }

my @found  = sort { $a->[1] <=> $b->[1] } @found;

use Data::Dumper;
say Dumper( \@found );

现在你有了一个数据结构,你可以用你喜欢的任何方式来处理,而不用在正则表达式中考虑所有这些东西。您决定如何做到这一点留给读者作为练习。

$VAR1 = [
          [
            'abc',
            1
          ],
          [
            'b',
            2
          ],
          [
            'cba',
            3
          ],
          [
            'b',
            4
          ],
          [
            'abc',
            5
          ],
          [
            'b',
            6
          ],
          [
            'b',
            9
          ],
          [
            'cba',
            11
          ],
          [
            'b',
            12
          ]
        ];

其中一部分可能是内联的。您可以构建这个数据结构,直到您知道到目前为止所拥有的一切都可以产生输出(i.e.您刚刚匹配的内容与之前的内容不重叠)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定与 perl 中的正则表达式匹配的部分 的相关文章

  • 如何通过 sudo (或作为另一个用户)打开 Perl 文件句柄写入数据

    我想将数据写入文件 但应使用特定用户的访问权限打开文件句柄 因此 有以下声明 open FH gt filename or die n 将允许以该特定用户的身份写入文件 有没有办法在 Perl 脚本中执行此操作 而无需运行整个脚本sudo
  • 打印 Perl 数组的简单方法? (有一点格式化)

    有没有一个easy如何打印每个元素之间用逗号分隔的 Perl 数组 编写一个 for 循环来做到这一点非常简单 但不太优雅 如果这是有道理的 只需使用join http perldoc perl org functions join htm
  • 正则表达式获取模式的最后一次出现

    我有一个字符串 我需要选择最后一次出现的模式 该字符串是 1302638400000 0 0 1302724800000 0 610 64999999999998 1302811200000 0 2266 6500000000001 130
  • 什么正则表达式永远无法匹配?

    Merged https meta stackexchange com questions 158066 what is a merged question with 永远不会与任何内容匹配的正则表达式 questions 1723182
  • 正则表达式仅允许特定数字

    我正在寻找一个只允许输入特定数字的正则表达式 例如2 4 5 6 10 18 我尝试过类似的东西 2 4 5 6 10 18 我输入的任何内容都无法通过正则表达式 然后计算机用手指着我并大笑 我哪里出错了 单引号是不必要的 您正在寻找的正则
  • 如何加速我的 Perl 程序?

    这确实是两个问题 但它们非常相似 为了简单起见 我想我应该把它们放在一起 Firstly 给定一个已建立的 Perl 项目 除了简单的代码优化之外 还有哪些不错的方法可以加速它 Secondly 用Perl从头开始编写程序时 有哪些好的方法
  • 正则表达式提取大括号之间的文本

    我正在尝试提取 PHP 中花括号之间的文本 例如 欢迎 user first name 使用 site 版本 1 5 您的用户名 是 user username 您目前的声誉是 user reputation name 我用过 在某些情况下
  • 正则表达式:如果字符串包含空格则不匹配

    仅当字符串不包含空格时 我似乎无法找出匹配字符串的正则表达式模式 例如 this has whitespace match some pattern 应该返回nil but nowhitespace match some pattern 应
  • 从“class”名称中删除/替换不需要的前缀信息

    我正进入 状态style从后端 它带有不需要的前缀 我会替换没有前缀的相同内容 正确的方法是什么 这就是我得到的
  • 如何使用Java中的正则表达式删除字符串中的反斜杠?

    如何使用Java中的正则表达式删除字符串中的反斜杠 例如 hai how are you 我只想要 hai how are you str str replaceAll or str str replace replaceAll 将第一个参
  • 在Python中高效匹配多个正则表达式

    当你有正则表达式时 词法分析器就很容易编写 今天我想用Python写一个简单的通用分析器 并想出了 import re import sys class Token object A simple Token structure Conta
  • 如何使用正则表达式限制小数点之前/之后/小数点以及整体的位数?

    我正在尝试检查数值是否具有特定数量的数字 总共不应超过 19 位数字 小数点前不能超过17位 整数部分 小数点后不得超过 4 位 小数部分 可以有小数点也可以没有 前面可以有 或 或没有 有效示例 1 1 0 0 1234567890123
  • 正则表达式等价

    有没有办法找出两个任意正则表达式是否等价 对我来说看起来很复杂的问题 但可能有一些 DFA 简化机制之类的 要测试等价性 您可以计算的表达式并进行比较
  • R正则表达式获取第二个下划线之前的所有文本

    s lt 1 343 43Hello 2 323 14 fdh 99H 在 R 中 我想使用正则表达式来获取第二个下划线之前的子字符串 如何使用一个正则表达式来完成此操作 另一种方法是用 分割 然后粘贴前两个 一些东西 paste sapp
  • 所有语言中特殊字符的 Java 正则表达式

    在我的用户输入字段中 我想允许某些特殊字符 字母和数字的组合 我应该确保正则表达式模式在输入时允许此设置任何语言 基本上我构建的这个正则表达式也应该支持 unicode 表示 如何使用 Java 中的 Pattern 类来实现这一点 这里给
  • 正则表达式匹配任何重复两次的字符

    我试图确定提供的字符串是否包含重复两次的字符 以下是我正在使用的正则表达式 a z 1 1 但是 当针对以下字符串进行测试时 下面的两个字符串都与模式匹配 尽管我使用了 1 gt gt gt re findall r a z 1 1 abc
  • 在 Perl 中解析 RSS/Atom 的最佳库是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我注意到XML RSS 解析器 http search cpan org dist XML RSS P
  • Notepad++:: 通过正则表达式完全删除包含问号的行

    嗯 我想这就是我的标题 这对于我将要实现的目标来说是不言自明的 这是我当前的文本文件的示例 Diva was the winning song of the Eurovision Song Contest 1998 Who will win
  • 使用“严格引用”时不能使用字符串作为 ARRAY 引用

    我正在尝试执行下面提到的代码并观察到错误 在使用 严格引用 时 无法使用字符串 RCSoWLAN ePDG 2 Qguest ASUS ATT 作为 ARRAY 引用 Perl代码 perl64 bin perl use strict us
  • 导入 .pl 文件

    我想知道如何将 Perl 文件导入到脚本中 我尝试了 use require 和 do 但似乎没有什么对我有用 这就是我用 require 做到的 usr bin perl require equations print x1 n 是否可以

随机推荐