正则表达式:当字符串重复字母模式时匹配

时间:2014-06-19 15:58:17

标签: regex

我正在使用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个字符。

2 个答案:

答案 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