24

文字の繰り返しを見つける正規表現を探しています。したがって、任意の文字が 2 回以上、たとえば次のようになります。

booooooot or abbott

探している手紙を事前に知ることはできません。

これは私がインタビューで尋ねられ、その後インタビューで尋ねられた質問です. 正しく理解している人はそれほど多くありません。

4

11 に答える 11

54

任意の文字\1を検索してから、同じ文字をもう一度 (またはそれ以上) 検索するために使用できます。手紙だけを知る必要がある場合は、それ$1が含まれます。それ以外の場合は、2 番目の一致を最初の一致に連結できます。

my $str = "Foooooobar";

$str =~ /(\w)(\1+)/;

print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'
于 2008-10-07T15:00:06.043 に答える
14

「\ w」には数字とアンダースコアが含まれているため、実際にはこれが必要だと思います。

([a-zA-Z])\1+

わかりました、わかりました、レオンのヒントを得ることができます。これを unicode-world または posix のものに使用します。

([[:alpha:]])\1+
于 2008-10-07T15:03:02.137 に答える
9

後方参照を使用するとうまくいくと思います:

(\w)\1+

\w基本的に[a-zA-Z_0-9]、A と Z の間の文字のみを一致させたい場合 (大文字と小文字を区別しない) は、[a-zA-Z]代わりに使用します。

(編集:または、彼のコメントで言及されているTanktalusのように(そして他の人も答えているように)、 [[:alpha:]]ロケールに敏感です)

于 2008-10-07T14:58:58.650 に答える
6

前のグループを参照するには、\N を使用します。

/(\w)\1+/g
于 2008-10-07T14:58:30.040 に答える
4

文字と見なされるものについては注意が必要な場合がありますが、これはロケールによって異なります。ISO Latin-1 を使用すると、アクセント付きの西洋言語の文字を文字として照合できます。次のプログラムでは、デフォルトのロケールが é を認識しないため、crééは一致しません。ロケール設定コードのコメントを外すと、一致が開始されます。

\w には、すべての文字とともに数字とアンダースコア文字が含まれることにも注意してください。文字だけを取得するには、非英数字、数字、およびアンダースコア文字の補数を取る必要があります。これで文字だけが残ります。

それを質問として組み立てると、理解しやすいかもしれません。

「3 以外の数字に一致する正規表現は?」
答えは次のとおりです。
/[^\D3]/

#! /usr/local/bin/perl

use strict;
use warnings;

# uncomment the following three lines:
# use locale;
# use POSIX;
# setlocale(LC_CTYPE, 'fr_FR.ISO8859-1');

while (<DATA>) {
    chomp;
    if (/([^\W_0-9])\1+/) {
        print "$_: dup [$1]\n";
    }
    else {
        print "$_: nope\n";
    }
}

__DATA__
100
food
créé
a::b
于 2008-10-07T15:55:28.787 に答える
3

次のコードは、2回以上繰り返されるすべての文字を返します。

my $str = "SSSannnkaaarsss";

print $str =~ /(\w)\1+/g;
于 2008-10-07T18:08:55.507 に答える
2

キックのために、まったく異なるアプローチ:

if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
    print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}
于 2008-10-08T04:01:45.700 に答える
1

参考までに、RegExBuddy は別として、正規表現をテストするための本当に便利な無料サイトは、gskinner.com の RegExrです。うまく処理([[:alpha:]])(\1+)します。

于 2008-10-07T19:28:48.247 に答える
0

これもうまくいくはずだと思います:

((\w)(?=\2))+\2

于 2011-08-08T22:15:08.167 に答える
0
/(.)\\1{2,}+/u

Unicode と一致する 'u' 修飾子

于 2012-05-23T21:42:17.523 に答える
0

どうですか:

(\w)\1+

最初の部分では、文字の周りに名前のないグループを作成し、次に後方参照で同じ文字を探します。

于 2008-10-07T14:58:52.537 に答える