我正在使用XYplorer文件浏览器中的Regex解释器。我想匹配任何具有重复“几个”字符组的字符串(在本例中为文件名)。更具体地说,我希望在字符串上匹配:
jack johnny - mary joe ken johnny bill
因为它'johnny'至少两次。请注意,它也有空格和破折号。
能够指定要匹配的组的长度会很好,但通常会有4,5或6个。
我在这里看了几个先前的问题,但要么是针对特定的模式,要么也涉及一些语言。几乎起作用的是:
RegEx: words with two letters repeated twice (eg. ABpoiuyAB, xnvXYlsdjsdXYmsd)
答案是:
\b\w*(\w{2})\w*\1
但是,当字符串中有空格时,这会失败。
我还想将我的搜索限制为.jpg文件,但是XYplorer有一个内置的过滤器,只能查看图像文件,所以这对我来说并不那么重要。
任何帮助将不胜感激,谢谢。
。 。
编辑 -
以下OnlineCop的正则表达式回答了我原来的问题,非常感谢:
(\ B \ W +。 \ b)中。(\ 1)
我看到它匹配单词,而不是任意字符串块,但这适用于我目前的需要。我只是在检测到一场比赛时没有兴趣捕捉任何东西。
作为一个改进,我想知道是否可以更改或扩展它以允许我指定必须相同的单词(或字符串块)的长度以声明匹配。所以,如果我指定匹配长度为5,我的文件名是:
1)jack john peter paul mary johnnie.jpg
2)jack johnnie peter paul mary johnnie.jpg
第一个不匹配,因为没有重复五个字符或更多字符的子字符串。第二个匹配,因为'johnnie'重复,超过5个字符。
答案 0 :(得分:1)
使用perl:
#!/usr/bin/perl
use strict;
use warnings;
while ( my $line = <STDIN> ) {
chomp $line;
my @words = split ( /\s+/, $line );
my %seen;
foreach my $word ( @words ) {
if ( $seen{$word} ) { print "Match: $line\n"; last }
$seen{$word}++;
}
}
是的,它不像一行正则表达式那样整洁,但它也有希望更清楚一些正在发生的事情。
答案 1 :(得分:1)
你想捕捉'johnny'这个词或它们之间的东西(或两者兼而有之)吗?
This example表明它选择了从第一个'johnny'到最后一个的所有内容,但它没有捕获到之间的东西:
Re: (\b\w+\b).*(\1)
Result: jack bill
This example允许名称/单词之间有一些空格:
Re: (\b\w+.*\b).*(\1)
String: Jackie Chan fought The Dragon who was fighting Jackie Chan
Result: Jackie Chan Jackie Chan