文字の繰り返しを見つける正規表現を探しています。したがって、任意の文字が 2 回以上、たとえば次のようになります。
booooooot or abbott
探している手紙を事前に知ることはできません。
これは私がインタビューで尋ねられ、その後インタビューで尋ねられた質問です. 正しく理解している人はそれほど多くありません。
任意の文字\1
を検索してから、同じ文字をもう一度 (またはそれ以上) 検索するために使用できます。手紙だけを知る必要がある場合は、それ$1
が含まれます。それ以外の場合は、2 番目の一致を最初の一致に連結できます。
my $str = "Foooooobar";
$str =~ /(\w)(\1+)/;
print $1;
# prints 'o'
print $1 . $2;
# prints 'oooooo'
「\ w」には数字とアンダースコアが含まれているため、実際にはこれが必要だと思います。
([a-zA-Z])\1+
わかりました、わかりました、レオンのヒントを得ることができます。これを unicode-world または posix のものに使用します。
([[:alpha:]])\1+
後方参照を使用するとうまくいくと思います:
(\w)\1+
\w
基本的に[a-zA-Z_0-9]
、A と Z の間の文字のみを一致させたい場合 (大文字と小文字を区別しない) は、[a-zA-Z]
代わりに使用します。
(編集:または、彼のコメントで言及されているTanktalusのように(そして他の人も答えているように)、 [[:alpha:]]
ロケールに敏感です)
前のグループを参照するには、\N を使用します。
/(\w)\1+/g
文字と見なされるものについては注意が必要な場合がありますが、これはロケールによって異なります。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
次のコードは、2回以上繰り返されるすべての文字を返します。
my $str = "SSSannnkaaarsss";
print $str =~ /(\w)\1+/g;
キックのために、まったく異なるアプローチ:
if ( ($str ^ substr($str,1) ) =~ /\0+/ ) {
print "found ", substr($str, $-[0], $+[0]-$-[0]+1), " at offset ", $-[0];
}
参考までに、RegExBuddy は別として、正規表現をテストするための本当に便利な無料サイトは、gskinner.com の RegExrです。うまく処理([[:alpha:]])(\1+)
します。
これもうまくいくはずだと思います:
((\w)(?=\2))+\2
/(.)\\1{2,}+/u
Unicode と一致する 'u' 修飾子
どうですか:
(\w)\1+
最初の部分では、文字の周りに名前のないグループを作成し、次に後方参照で同じ文字を探します。