Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl在另一个字符串中间添加字符串_Regex_Perl - Fatal编程技术网

Regex Perl在另一个字符串中间添加字符串

Regex Perl在另一个字符串中间添加字符串,regex,perl,Regex,Perl,在Perl中,转换此字符串的最佳方法是: 770555200-4299 进入 770555200-770554299 我知道如何抓取前6位数字,但不知道如何在连字符后插入它们 #!/usr/bin/perl use strict; use warnings; my $num = '7705554200-4299'; # Check to see number is a range if ($num =~ /-/) { # Pull area code and exchange my

在Perl中,转换此字符串的最佳方法是:

770555200-4299

进入

770555200-770554299

我知道如何抓取前6位数字,但不知道如何在连字符后插入它们

#!/usr/bin/perl

use strict;
use warnings;

my $num = '7705554200-4299';

# Check to see number is a range
if ($num =~ /-/)
{
  # Pull area code and exchange
  my $extract = substr($num, 0, 6);
  print "Area code + exchange: $extract\n";
}
算出

#!/usr/bin/perl

my $num = '7704814200-4299';

# Check to see if it is a range
if ($num =~ /-/)
{
  # Pull area code and exchange
  my $extract = substr($num, 0, 6);
  print "Extracted this: $extract\n";

  $num =~ s/-/-$extract/;
  print $num;

}

由于您并不真正需要正则表达式模式匹配的全部功能,因此可以使用和的第四个参数在连字符后立即插入一些字符:

use strict;
use warnings;

my $num = '7705554200-4299';
substr($num, index($num, '-') + 1, 0, substr($num, 0, 6));
print "$num\n";
您也可以使用substr作为左值,但就个人而言,我发现该版本更为迟钝:

substr($num, index($num, '-') + 1, 0) = substr($num, 0, 6);
结果:

7705554200-7705554299

虽然您可以在正则表达式中执行此操作,但您发现了一种解决方案,该解决方案允许您打印调试信息,并且可能更易于维护。恭喜!不是每个解决方案都应该使用正则表达式!有时这是不可避免的,但这次不是。为了支持Tanktalus的评论,这是一个很好的解决方案。晶莹剔透,美观大方。大多数情况下,复杂正则表达式都有替代方法,它们通常是更好的代码。这里的正则表达式并没有那么难,我仍然喜欢您所做的,作为参考:$num=~s/\d{6}\d*-\K/$1/。唯一的诀窍是\K,一种特殊形式的正向查找。这些模式只能断言某些东西在那里,而不会消耗它。\K还“释放”它之前匹配的所有内容,以便替换不会触及它。所以我们不必重新输入。请参见事实上\K在环视断言下