匹配Perl中第n个可能的最长字符串

加利福尼亚州

Perl正则表达式的模式匹配量词为“贪心”(它们与最长的字符串匹配)。要强制比赛“不协调”,是吗?可以附加到模式量词(*,+)。

这是一个例子:

#!/usr/bin/perl

$string="111s11111s";

#-- greedy match
$string =~ /^(.*)s/;
print "$1\n"; # prints 111s11111

#-- ungreedy match
$string =~ /^(.*?)s/;
print "$1\n"; # prints 111

但是,如何在Perl中找到第二,第三和..可能的字符串匹配?举一个简单的例子-如果需要更好的例子。

磨坊主

使用条件表达式代码表达式回溯控制动词

my $skips = 1;
$string =~ /^(.*)s(?(?{$skips-- > 0})(*FAIL))/;

上面将使用贪婪匹配,但是会导致最大匹配故意失败。如果您想要第3大,则可以将跳过次数设置为2。

如下所示:

#!/usr/bin/perl
use strict;
use warnings;

my $string = "111s11111s11111s";

$string =~ /^(.*)s/;
print "Greedy match     - $1\n";

$string =~ /^(.*?)s/;
print "Ungreedy match   - $1\n";

my $skips = 1;
$string =~ /^(.*)s(?(?{$skips-- > 0})(*FAIL))/;
print "2nd Greedy match - $1\n";

输出:

Greedy match     - 111s11111s11111
Ungreedy match   - 111
2nd Greedy match - 111s11111

使用此类高级功能时,重要的是要充分了解正则表达式以预测结果。这种特殊情况有效,因为正则表达式的一端固定为^这意味着我们知道每个后续的比赛也比前一场短。但是,如果两端都可以移动,则我们不一定可以预测顺序。

如果是这种情况,那么您将全部找到它们,然后对其进行排序:

use strict;
use warnings;

my $string = "111s11111s";

my @seqs;
$string =~ /^(.*)s(?{push @seqs, $1})(*FAIL)/;

my @sorted = sort {length $b <=> length $a} @seqs;

use Data::Dump;
dd @sorted;

输出:

("111s11111s11111", "111s11111", 111)

之前的Perl版本的注意事项 v5.18

Perl进行v5.18了一项更改,/(?{})/并且/(??{})/已经进行了大量修改,使词汇变量的范围能够在上述代码表达式中正常工作。在此之前,上述代码将导致以下错误,如在v5.16.2下运行的此子例程版本所示

Variable "$skips" will not stay shared at (re_eval 1) line 1.
Variable "@seqs" will not stay shared at (re_eval 2) line 1.

RE代码表达式的较早实现的解决方案是在初始化时使用来声明变量our,并为了进一步的良好编码习惯而对localize它们进行声明。在v5.16.2下运行的修改后的子例程版本中对此进行了演示,或如下所示:

local our @seqs;
$string =~ /^(.*)s(?{push @seqs, $1})(*FAIL)/;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

第n个最长的字符串排序

来自分类Dev

Excel - 从相应的数据中获取第 2 个或第 n 个匹配的字符串

来自分类Dev

如何替换字符串中的第n个匹配项

来自分类Dev

如何使用正则表达式匹配字符串中的第n个出现

来自分类Dev

如何替换字符串中的第n个匹配项

来自分类Dev

匹配包含十六进制数字的字符串中的第 n 个出现次数

来自分类Dev

匹配最长的字符串

来自分类Dev

perl:字符串匹配以找到最长的子字符串

来自分类Dev

替换字符串的第1到第n个匹配项。javascript

来自分类Dev

替换字符串的第1到第n个匹配项。javascript

来自分类Dev

字符串中的第 N 个 indexOf?

来自分类Dev

循环遍历n个对象并返回最长的字符串

来自分类Dev

有效地查找字符串中的n个最长单词

来自分类Dev

与数组中的字符串匹配的最长子字符串

来自分类Dev

正则表达式构建字符串,直到遇到第N个匹配项

来自分类Dev

正则表达式构建字符串,直到遇到第N个匹配项

来自分类Dev

在字符串列表的第n个元素中插入字符串

来自分类Dev

从匹配的字符串中删除第n行(在文件中仅出现一次)

来自分类Dev

在给定的基本字符串中查找 a 字符串的最长子字符串匹配

来自分类Dev

检查DataFrame中的第n个值是否等于字符串中的第n个字符

来自分类Dev

如何在Python中的模式匹配后提取第n行字符串?

来自分类Dev

如何在Groovy中删除最多{(字符串中第n个出现的模式)或(串联字符串中的第n个部分)}?

来自分类Dev

在Perl模式匹配中打印匹配的字符串

来自分类Dev

如何删除字符串dataframe列中第n个开头之后的所有字符?

来自分类Dev

优化查找字符串中第N个出现的字符

来自分类Dev

替换字符串/文本中单词的“从第n个到最后一个”出现

来自分类Dev

Perl中字符串之间的字符匹配计数

来自分类Dev

Perl:如何匹配字符串中的特定字符?

来自分类Dev

Perl-2个或更多字符串的最长公共前缀?

Related 相关文章

  1. 1

    第n个最长的字符串排序

  2. 2

    Excel - 从相应的数据中获取第 2 个或第 n 个匹配的字符串

  3. 3

    如何替换字符串中的第n个匹配项

  4. 4

    如何使用正则表达式匹配字符串中的第n个出现

  5. 5

    如何替换字符串中的第n个匹配项

  6. 6

    匹配包含十六进制数字的字符串中的第 n 个出现次数

  7. 7

    匹配最长的字符串

  8. 8

    perl:字符串匹配以找到最长的子字符串

  9. 9

    替换字符串的第1到第n个匹配项。javascript

  10. 10

    替换字符串的第1到第n个匹配项。javascript

  11. 11

    字符串中的第 N 个 indexOf?

  12. 12

    循环遍历n个对象并返回最长的字符串

  13. 13

    有效地查找字符串中的n个最长单词

  14. 14

    与数组中的字符串匹配的最长子字符串

  15. 15

    正则表达式构建字符串,直到遇到第N个匹配项

  16. 16

    正则表达式构建字符串,直到遇到第N个匹配项

  17. 17

    在字符串列表的第n个元素中插入字符串

  18. 18

    从匹配的字符串中删除第n行(在文件中仅出现一次)

  19. 19

    在给定的基本字符串中查找 a 字符串的最长子字符串匹配

  20. 20

    检查DataFrame中的第n个值是否等于字符串中的第n个字符

  21. 21

    如何在Python中的模式匹配后提取第n行字符串?

  22. 22

    如何在Groovy中删除最多{(字符串中第n个出现的模式)或(串联字符串中的第n个部分)}?

  23. 23

    在Perl模式匹配中打印匹配的字符串

  24. 24

    如何删除字符串dataframe列中第n个开头之后的所有字符?

  25. 25

    优化查找字符串中第N个出现的字符

  26. 26

    替换字符串/文本中单词的“从第n个到最后一个”出现

  27. 27

    Perl中字符串之间的字符匹配计数

  28. 28

    Perl:如何匹配字符串中的特定字符?

  29. 29

    Perl-2个或更多字符串的最长公共前缀?

热门标签

归档