1

110110と一致させたかったのですが、10110とは一致させませんでした。つまり、同じである2つの連続する数字が少なくとも2回繰り返されることを意味します。そのための正規表現はありますか?

一致する必要があります:110110、123445446、12344544644

一致しないはずです:10110、123445

4

6 に答える 6

9
/(\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
于 2009-07-22T11:09:13.853 に答える
7

私が正しく理解していれば、正規表現は次のようになります。

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
于 2009-07-22T11:38:53.250 に答える
3

すべての数字について話している場合は、次のようになります。

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
于 2009-07-22T11:07:13.907 に答える
0

私があなたの質問を正しく理解していれば、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 番目の文字列が一致することに注意してください。

于 2009-07-22T11:09:00.470 に答える
0

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__
于 2009-07-22T11:22:52.110 に答える
0

データの状態に応じて、最小限の正規表現の方法を次に示します。

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
于 2009-07-22T11:24:43.807 に答える