1

リテラル文字の間にある N 個の数字を削除 (または置換) する必要がある状況があります。例えば:

00000ASEDF32434VSC

出力が次のようになるように、32434 を削除する必要があります。

00000ASEDFVSC

そして、 32434 を XXXXX に置き換えたい場合は?

正規表現を使用してそれを行う方法は?

編集

私は非常にばかげた例を選びました。申し訳ありません。このことを考慮:

00000SQWDDWE12CSDCASEDF32434VSC

パターン 32434 のみを置換 (または削除) する必要があります。

一般的なケース:英数字の文字列がある
場合、リテラル文字の間にある N (たとえば 5) の数字のパターンを削除するにはどうすればよいですか?

ありがとう。

4

5 に答える 5

2

リテラル文字の間にある場合、N (たとえば 5) の数字のパターンを削除しますか?

「リテラル文字」とはどういう意味ですか? 「手紙」のことですか?次の例では、前後に文字が続く 5 桁 (0 ~ 9) のシーケンスを削除します。

$str =~ s/(?<=\pL)[0-9]{5}(?=\pL)//;

変数は自由に変更5できます。

my $n = 5;
$str =~ s/(?<=\pL)[0-9]{$n}(?=\pL)//;

Perl 5.14+ から、 を使用\dして意味するよう[0-9]に使用できます/a。( がなければ/a\d400 以上の異なる文字に一致します。)

$str =~ s/(?<=\pL)\d{5}(?=\pL)//a;
于 2013-01-16T01:45:43.000 に答える
2

先読み(?=...)と後読みを使用して、数字の前後(?<=...)に非数字があることをアサートできます。これにより、そのような囲まれた番号が削除されます。

$str =~ s{ (?<=\D) (\d+) (?=\D) }{}xg;

別の置換を与えることも、実行されるコードを与えることもできます。可変長の場合X:

$str =~ s{(?<=\D) (\d+) (?=\D)}{ "X" x length $1 }xge;

/e置換を実行しx、あまり使用されていない繰り返し演算子です。

以下は、そのような数列をすべて削除した文字列を返すサブルーチンです。オプションで最小長と最大長を指定できます。

use Carp;
sub remove_numbers {
  my ($string, $min, $max) = @_;
  $min //= 1;
  $max //= "";
  croak qq(argument \$min is not valid) if $min =~ /[^0-9]/;
  croak qq(argument \$max is not valid) if $max =~ /[^0-9]/;
  $string =~ s/(?<=\D) (\d{$min,$max}) (?=\D)/"X" x length $1/xge;
  return $string;
}

呼び出し

$str = remove_numbers($str, 5, 5);

と同等$str =~ s/(?<=\D)(\d{5})(?=\D)/XXXXX/です。呼び出し

$str = remove_numbers($str);

私の2番目のコード例と同等です。

于 2013-01-16T01:47:39.763 に答える
1

関連する部品を引き出して交換し、再梱包することができます。私はそれが数字の単一のインスタンスであると仮定しています。そうすれば、いくつでも構いませんが、常に同じ数の「X」に置き換えます...

$str = "00000ASEDF32434VSC";

my($prefix, $digits, $suffix) = $str =~ /^(.*[a-z])(\d+)([a-z].*)$/i;

# Replace with X
$str = $prefix . ($digits =~ s/./X/g) . $suffix;

# Or remove
$str = $prefix . $suffix;

ただし、正規表現が成功したことを確認したいでしょう!

あなたの編集に応えて:あなたは実際に特定の番号を削除したい...

$str = $str =~ s/^(.*[a-z])32434([a-z].*)$/$1XXXXX$2/i;

または、5桁が必要な場合(これはすでに回答されています)

$str = $str =~ s/^(.*[a-z])\d{5}([a-z].*)$/$1XXXXX$2/i;
于 2013-01-16T01:35:05.650 に答える
1

次のコードを使用して削除します。

$str =~ s/([a-z]+)\d{5}([a-z]+)/\1\2/i;

そしてこれを置き換える:

$str =~ s/([a-z]+)\d{5}([a-z]+)/\1XXXXX\2/i;

ここで、5 は置き換えなければならない数です。

于 2013-01-16T01:28:23.683 に答える
0
$str =~ s/[1-9]//g

これにより、1 ~ 9 のすべての数字が削除されます。これは機能しますか?

$str =~ s/(\D)\d\d*(\D)/$1$2/g

数値が文字列の間にある場合にのみ置換する必要がありますが、機能するかどうかはわかりません。

于 2013-01-16T01:25:32.827 に答える