1

電話の既知の行番号の前にある数字が存在する場合は、それらを取得しようとしています(Perlの場合)。ダッシュはなく、数字のみです。

たとえば、行番号が常に8675309になることを知っているとします。8675309は、先頭の数字が含まれる場合と含まれない場合があります。先頭の桁数に制限はありません。

$input          $digits       $number
'8675309'       ''            '8675309'
'8008675309'    '800'         '8675309'
'18888675309'   '1888'        '8675309'
'18675309'       '1'           '8675309'
'86753091'      not a match

/8675309$/これは、1つの正規表現で前桁をキャプチャする方法と一致しますか?

4

6 に答える 6

9

一部の正規表現は、順方向よりも逆方向の方がうまく機能します。そのため、正規表現ではなく、sexeger を使用すると便利な場合があります。

my $pn = '18008675309';

reverse($pn) =~ /^9035768(\d*)/;
my $got = reverse $1;

正規表現はよりクリーンであり、入力値とキャプチャされた値を逆にすることで多少面倒なことを犠牲にして、多くのバック トラッキングを回避します。

この場合のバックトラッキングのゲインは、一般的な電話番号抽出の正規表現を使用した場合よりも小さくなります。

Regex:   /^(\d*)\d{7}$/
Sexeger: /^\d{7}(\d*)/

この手法が役立つ問題はさまざまです。詳細については、Perlmonks の sexeger の投稿を参照してください。

于 2010-01-14T16:00:40.813 に答える
2
my($digits,$number);
if ($input =~ /^(\d*)(8675309)$/) {
  ($digits,$number) = ($1,$2);
}

数量詞は貪欲ですが、それは一致を許可しながら*可能な限り一致することを意味します。したがって、最初は、はい、のすべての数字を飲み込もうとしますが、パターン全体が正常に一致するまで、一致したものを文字ごとにしぶしぶ放棄します。\d*$number

別のアプローチは、尻尾を切り落とすことです。

(my $digits = $input) =~ s/8675309$//;

正規表現を使用せずに同じことを行うことができます。

my $digits = $input;
substr($digits, -7) = "";

上記は、少なくともperl-5.10-1では、次のように凝縮することもできます。

substr(my $digits = $input, -7) = "";
于 2010-01-14T15:47:49.780 に答える
1

少なくとも英国と米国の電話番号を扱う Perl パッケージがあります。

これは Number::Phone と呼ばれ、コードは cpan.org サイトのどこかにあります。

于 2011-10-28T07:41:39.870 に答える
1

正規表現の特殊変数 $` と $& は、これらの情報を取得する別の方法です。これらはそれぞれ、一致前のデータの内容と一致自体を保持します。

   if ( /8675309$/ )
      {
      printf( "%s,%s,%s\n", $_, $`, $& );
      }
   else
      {
      printf( "%s,Not a match\n", $_ );
      }
于 2010-01-14T16:15:48.210 に答える
0

どう/(\d)?(8675309)/ですか?アップデート:

あったはずのフープ/(\d*)(8675309)/

于 2010-01-14T15:48:53.943 に答える
0

問題が分からないことがあります。最初の例と 4 番目の例に違いがあるのはなぜですか。

'8675309'    ''   '8675309'  
...  
'8675309'    '1'  '8675309'

最後の 7 桁を他のすべてのものから分離することだけが必要な場合は、混乱を招く例を提供するのではなく、そのように言うことができます。そのための正規表現は次のようになります。

/(\d*)(\d{7,7})$/

仮の数字を提供しただけではなく、実際に '8675309' を含む行だけを探している場合 (奇妙に思えます)、'\d{7,7}' を '8675309' に置き換えます。

于 2010-01-14T18:07:16.063 に答える