2016-10-05 7 views
1

でGSUBを持つオペレータはのは、私は以下の文字列を持っているとしましょう:perl正規表現と|を使用して文字を大文字に変換する方法R

x = c("123 w. main ave., city, st", "mr. smith", "456 main st.") 

は私が大文字にする必要があります知っている文字列の特定の部分を活用できるようにしたいです。私は次のようなアプローチでgsubperlを使用してこれを達成できると思っていた:

gsub("(m)(rs?\\.)|(a)(ve\\.[\\s,])|(s)(t\\.[\\s,$])", "\\U\\1\\L\\2", x, perl=T) 

はしかし、これは以下のような結果になります。最初の文字列で

# [1] "123 w. main city, st" "Mr. smith"   "456 main" 

、それがためにマッチしたテキストを削除しましたその文字列でマッチした正規表現グループは\\3\\4でした。 2番目の文字列では、グループ\\1\\2と一致しているため、意図したとおりに動作します。 3番目の文字列では、同じ理由で最初の文字列と同じことをしました。

私の望ましい結果は、次のようになります:

# [1] "123 w. main Ave., city, st", "Mr. smith", "456 main St." 

私の質問、そして、あなたはそれが見つかったグループと置き換えるために正規表現を教えてくださいどのようにでしょうか?インスタンスごとに異なる正規表現を実行する必要がありますか?

+0

'$'は文字列の末尾になっていますか? –

+0

@WiktorStribiżewしかし、 '[]'は文字に特別な影響を与えないので、実際にはドル記号になることを認識しています... – brittenb

答えて

2

私はbranch reset group(?|...|...))を使用することをお勧めして$は、文字列の終わりを示すように見えることから、あなたは交代グループ(?:[\s,]|$)ではなく[\s,$]文字クラスを必要としています。

x = c("123 w. main ave., city, st", "mr. smith", "456 main st.") 
gsub("(?|(m)(rs?\\.)|(a)(ve\\.[\\s,])|(s)(t\\.(?:[\\s,]|$)))", "\\U\\1\\L\\2", x, perl=T) 
## => [1] "123 w. main Ave., city, st" "Mr. smith" "456 main St." 

分岐リセットグループにthis online R demo

おかげを見る、グループ内のすべての捕捉基は、それぞれ別個のブランチに1から始まるインデックス付けされます。

+0

あなたは正規表現のスキルに感心することは決してありません。ありがとう! – brittenb

関連する問題