110110と一致させたかったのですが、10110とは一致させませんでした。つまり、同じである2つの連続する数字が少なくとも2回繰り返されることを意味します。そのための正規表現はありますか?
一致する必要があります:110110、123445446、12344544644
一致しないはずです:10110、123445
/(\d)\1.*\1\1/
これは、二重数の 2 つのインスタンスを含む文字列に一致します。つまり、11011 ですが 10011 には一致しません。
\d
任意の数字
\1
に一致する 最初の一致に一致する 最初のエントリを実質的に 2 倍にする
これは 1111 にも一致します。間に他の文字が必要な場合は、.* を .+ に変更します
おお、こっちの方がきれいに見える
((\d)\2).*\1
一致しない値を見つけたいが、2 セットの double が必要な場合は、次のように最初の部分を再度追加するだけです。
((\d)\2).*((\d)\4)
ブラケットは、$1 と $3 に 2 桁の数字が含まれ、$2 と $4 に 1 桁の数字が含まれることを意味します (2 倍になります)。
11233
$1=11
$2=1
$3=33
$4=3
私が正しく理解していれば、正規表現は次のようになります。
m{
(\d)\1 # First repeated pair
.* # Anything in between
(\d)\2 # Second repeated pair
}x
例えば:
for my $x (qw(110110 123445446 12344544644 10110 123445)) {
my $m = $x =~ m{(\d)\1.*(\d)\2} ? "matches" : "does not match";
printf "%-11s : %s\n", $x, $m;
}
110110 : matches
123445446 : matches
12344544644 : matches
10110 : does not match
123445 : does not match
すべての数字について話している場合は、次のようになります。
00.*00|11.*11|22.*22|33.*33|44.*44|55.*55|66.*66|77.*77|88.*88|99.*99
それは単に 9 つの異なるパターンを OR したものであり、それぞれが目的の 2 桁のパターンの少なくとも 2 つの出現をチェックします。
Perl のより高度な RE を使用すると、次の 2 つの連続する数字を 2 回使用できます。
(\d)\1.*\1\1
または、コメントの1つが述べているように、2つの連続した数字の後に、同じではない可能性のあるさらに2つの連続した数字が続きます。
(\d)\1.*(\d)\2
私があなたの質問を正しく理解していれば、regexbuddy (perl 構文を使用するように設定) によると、これは 110110 に一致しますが、10110 には一致しません。
(1{2})0\10
以下はより一般的で、文字列内で 2 つの等しい数字が繰り返される任意の文字列に一致します。
(\d{2})\d+\1\d*
上記は次の例と一致します。
110110 110011 112345611 2200022345
最後に、文字列内の 2 組の 2 桁の数字を見つけるには、それらがどこにあるかは気にしません。これを試してください。
\d*?(\d{2})\d+?\1\d*
これは、上記の例と次の例に一致します。
12345501355789
上記の例のダブル 5 の 2 つのセットが一致します。
[更新] 文字列を 2 つの異なる 2 桁の数字と一致させるという追加の要件を見たところで、これを試してください。
\d*?(\d)\1\d*?(\d)\2\d*
これは、次のような文字列に一致します。
12342202345567
12342202342267
22 と 55 によって最初の文字列が一致し、22 のペアによって 2 番目の文字列が一致することに注意してください。
1 つの正規表現ですべてを行う理由はありません...残りの Perl も同様に使用できます。
#!/usr/bin/perl -l
use strict;
use warnings;
my @strings = qw( 11233 110110 10110 123445 123445446 12344544644 );
print if is_wanted($_) for @strings;
sub is_wanted {
my ($s) = @_;
my @matches = $s =~ /(?<group>(?<first>[0-9])\k<first>)/g;
return 1 < @matches / 2;
}
__END__
データの状態に応じて、最小限の正規表現の方法を次に示します。
while(<DATA>){
chomp;
@s = split/\s+/;
foreach my $i (@s){
if( $i =~ /123445/ && length($i) ne 6){
print $_."\n";
}
}
}
__DATA__
This is a line
blah 123445446 blah
blah blah 12344544644 blah
.... 123445 ....
this is last line