これは、正規表現とで行うことができますgsub
。
gsub('^([a-z]{3})([a-z]+)$', '\\1d\\2', old)
# [1] "abcdefg"
これを動的に実行する場合は、次を使用して式を作成できますpaste
。
letter <- 'd'
lhs <- paste0('^([a-z]{', n-1, '})([a-z]+)$')
rhs <- paste0('\\1', letter, '\\2')
gsub(lhs, rhs, old)
# [1] "abcdefg"
DWinのコメントによると、これをより一般的にしたいと思うかもしれません。
gsub('^(.{3})(.*)$', '\\1d\\2', old)
このように、小文字だけでなく、任意の3文字が一致します。DWinは、sub
の代わりにを使用することもお勧めしgsub
ます。この方法では、最初のインスタンスにのみ一致する^
ため、それほど心配する必要はありません。sub
しかし、私は正規表現で明示的に表現するのが好きで、それらを理解し、より一般性の必要性を見つけたときに、より一般的な表現にのみ移行します。
Greg Snowが指摘したように、一致の背後にある別の形式の正規表現を使用できます。
sub( '(?<=.{3})', 'd', old, perl=TRUE )
また、:ではなくgsub
を使用して上記のダイナミックを構築することもできます:sprintf
paste0
lhs <- sprintf('^([a-z]{%d})([a-z]+)$', n-1)
または彼のsub
正規表現の場合:
lhs <- sprintf('(?<=.{%d})',n-1)