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!''
もちろん、一重引用符が文字列の末尾または先頭にのみ表示されることが予想される場合は、このように凝る必要はありません。必要な手段を使用して、最後の文字と最初の文字を削除するだけでかまいません。たとえば、スプートニクがちょうど提案したように:
s/^'|'$//g;
foreach (<DATA>) {
s/(:?(^\s*'|'$))//g;
print;
}
__DATA__
'It's raining again!'
出力
It's raining again!
説明
(:?)
不要なキャプチャを防ぐ