正则表达式用perl中的普通短划线搜索和替换十进制短划线?

时间:2015-09-15 09:36:18

标签: regex perl encoding utf-8

我目前需要一个正则表达式来搜索和替换所有| - |与| - |。我目前正在替换|`|与|'|它正在使用:

while($_ =~ s/`/'/g)
{
  print "Line: '$.'. ";
  print "Found '$&'. ";
}

然而,使用相同的正则表达式并不适用于我以下的所有尝试:

while($_ =~ s/\–/-/g)
{
  print "Line: '$.'. ";
  print "Found '$&'.\n";
}

while($_ =~ s/\&#8211/-/g)
{
  print "Line: '$.'. ";
  print "Found '$&'.\n";
}

while($_ =~ s/\&ndash/-/g)
{
  print "Line: '$.'. ";
  print "Found '$&'.\n";
}
while($_ =~ s/\–/-/g)
{
  print "Line: '$.'. ";
  print "Found '$&'.\n";
}

while($_ =~ s/&#8211/-/g)
{
  print "Line: '$.'. ";
  print "Found '$&'.\n";
}

while($_ =~ s/&ndash/-/g)
{
  print "Line: '$.'. ";
  print "Found '$&'.\n";
}

脚本目前看起来如下:

#!/usr/bin/perl
use strict;
use warnings;
my $FILE;
my $filename = 'NoDodge.c';

open($FILE,"<service.c") or die "File not opened";
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
while (<$FILE>)
{
  while($_ =~ s/`/'/g)
  {
    print "Line: '$.'. ";
    print "Found '$&'. ";
  }
  while($_ =~ s/\&#8211/-/g)
  {
    print "Line: '$.'. ";
    print "Found '$&'.\n";
  }
  print $fh $_;
}
close $fh;
print "\nCompleted\n";

当前结果示例:

行:'152'。找到'''。

线:'162'。找到'''。

已完成

解: 由鲍罗丁提供,

#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open qw/ :std :encoding(utf8) /;

my $FILE;
my $fh;
my $readfile = 'service.c';
my $writefile = 'NoDodge.c';

open($FILE,'<',$readfile) or die qq{Unable to open "$readfile" for input: $!};
open($fh, '>',$writefile) or die qq{Unable to open "$writefile" for output: $!};
while (<$FILE>)
{
  while(s/–/-/g)
  {
    print "Found: $& on Line: $.\n";
  }

  while(s/`/'/g)
  {
    print "Found: $& on Line: $.\n";
  }

  print $fh $_;
}
close $fh;
close $FILE;
print "\nService Migrated to $writefile\n";

示例输出:

找到: - 在线:713

发现:`在线:713

找到: - 在线:724

发现:`在线:724

发现:`在线:794

服务迁移到NoDodge.c

1 个答案:

答案 0 :(得分:4)

您需要在程序顶部use utf8,否则Perl会看到组成en-dash的UTF-8编码的各个字节(E2 80 { {1}})。也没有必要指定93作为替换的对象,因为它是默认值,并且你不需要逃避一个短划线,因为它不是一个特殊字符正则表达式

$_

或者您可能希望使用Unicode名称使其更清晰,因为它一目了然地显示您正在替换的内容。在这种情况下,只要您命名每个非ASCII字符而不是按字面意思使用它,就不需要use utf8; ... while( s/–/-/g ) { ... } ,就像这样

use utf8


您还需要打开文件 - 输入和输出 - 为UTF-8编码。最简单的方法是将UTF-8设置为默认模式。您可以在程序顶部附近添加此行

while( s/\N{EN DASH}/-/g ) { ... }

或者你可以像UTF-8那样明确地打开每个文件

use open qw/ :std :encoding(utf8) /;