6

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

例如:

'又下雨了!'

打印

又下雨了!

非常感谢

4

3 回答 3

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
于 2012-12-11T23:08:51.307 回答
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;
于 2012-12-11T23:11:01.103 回答
1
foreach (<DATA>) {
    s/(:?(^\s*'|'$))//g;
    print;
}
__DATA__
 'It's raining again!'

输出

It's raining again!

解释

  • 有不止一种方法可以做到这一点
  • (:?)防止不必要的捕获
于 2012-12-11T23:12:45.773 回答