首页 > 解决方案 > Perl - 在字符串中查找相同的字符序列

问题描述

事实上,我有一个文本文件,其中每行都写有句子,我必须为每行的每个句子找到相同的字符序列。例如,其中一个句子是

一分耕耘一分收获

并且我希望能够确定该字符串中共享字符的序列是ain.

我尝试使用正则表达式(顺便在stackoverflow上找到),但它是为了找到相同连续字符的序列,这不是我想要的。所以作为 perl 的初学者,我不知道如何实现它。预先感谢您的时间和关注。

编辑:这是我尝试过的,但不是我想要的:

#!/usr/bin/perl

use utf8;

open $file, "<:encoding(utf8)", "text.txt";

while($ligne=<$file>)
{   
    while($ligne =~ /(.)\1+/g)
    {
        $gram = $1;
        print "$ligne\n";
        print "$gram\n";
    }
}

标签: regexstringperl

解决方案


这是一个简单的概念证明,它匹配ain“pain”,然后稍后在字符串中查找相同的匹配,然后在“gain”中找到它。我正在使用“匹配名为子模式'Match'的匹配,这就是正则表达式匹配ain(或no)的方式。

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

my $string = "no pain no gain";

if ($string =~ m/(?<Match>[a-zA-Z]{3}).*\k<Match>/g) {
    print "Match: $+{Match}\n";
}

输出:

Match: ain

请注意,如果将长度说明符更改为 2,则匹配变为“no”,而不是“ain”。

为您的实际需求实现更强大的正则表达式,只需遍历您拥有的每一行并测试匹配。

顺便说一句,regex101.com是学习和练习正则表达式的绝佳资源。我推荐它10000%。


推荐阅读