我想知道如何在 perl 中删除单引号而不是撇号。
例如:
'又下雨了!'
打印
又下雨了!
非常感谢
如果您假设单引号之前或之后总是有空格,则以下一对正则表达式应该可以工作:
$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
棘手的一个。一些单引号出现在字母之后或之前,但您只想删除字母之间的单引号。也许是这样的,使用负面的环视:
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' toys
和that's
,但语言总是难以预测。例如,几乎不可能解决以下问题:
'She looked at him and said, 'That's impossible!''
当然,如果你希望你的单引号只出现在字符串的末尾或开头,你不需要这么花哨,你可以用任何必要的手段删除最后一个和第一个字符。例如,正如 sputnik 刚刚建议的那样:
s/^'|'$//g;
foreach (<DATA>) {
s/(:?(^\s*'|'$))//g;
print;
}
__DATA__
'It's raining again!'
输出
It's raining again!
解释
(:?)
防止不必要的捕获