如何在perl中删除单引号但不删除撇号

时间:2012-12-11 23:06:19

标签: perl

我想知道如何在perl中删除单引号但不删除撇号。

例如:

  

'再次下雨!'

打印

  

再次下雨!

非常感谢

3 个答案:

答案 0 :(得分:4)

如果您假设单引号始终以空格开头或后跟,则以下一对正则表达式应该有效:

$line =~ s/\s'/ /g;  #preceded by whitespace
$line =~ s/'\s/ /g;  #followed by whitespace

您还需要考虑字符串是否以单引号开头或结尾:

$str =~ s/^'//;  #at the start of a string
$str =~ s/'$//;  #at the end of a string

答案 1 :(得分:1)

棘手的一个。一些单引号出现在字母之后或之前,但您只想删除字母之间的引号。也许是这样的,使用否定的外观:

s/(?<![\pL\s])'|'(?![\pL\s])//g;

将删除 单引号,不带字母或空格之后或之前。很多否定都要跟踪那里。扩展版本:

s/
    (?<![\pL\s])'   # no letters or whitespace before single quote
    |               # or
    '(?![\pL\s])    # no letters or whitespace after single quote
//gx;

这将涵盖像Eli Algranti在评论中指出的那样的词语boys' toysthat's,但语言总是难以预测。例如,几乎不可能解决类似的问题:

'She looked at him and said, 'That's impossible!''

当然,如果你希望你的单引号只出现在字符串的结尾或开头,你不需要这么花哨,你可以用任何必要的方法删除最后一个和第一个字符。例如,像sputnik刚刚建议的那样:

s/^'|'$//g;

答案 2 :(得分:1)

foreach (<DATA>) {
    s/(:?(^\s*'|'$))//g;
    print;
}
__DATA__
 'It's raining again!'

<强>输出

It's raining again!

<强>说明

  • 有多种方法可以做到这一点
  • (:?)阻止不需要的捕获