我想知道如何在perl中删除单引号但不删除撇号。
例如:
'再次下雨!'
打印
再次下雨!
非常感谢
答案 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' toys
和that'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!
<强>说明强>
(:?)
阻止不需要的捕获