2016-07-27 8 views
1

段落以上のような長い文字列があり、頻繁に表示される特定の単語があり、それをKEYと呼ぶことができます。正規表現の後に単語の後に nを挿入する

各キーの後に続く単語の後ろに「\ n」を挿入します。

したがって、文字列がある場合KEY Hello this is KEY an exampleKEY Hello \nthis is KEY an \nexample

タスクがややシンプルで、KEYの後に\ nを追加したい場合は、簡単にgsub("KEY","KEY \n",string)とすることができますが、正規表現にはエレガントな方法があるとは思わない試合後の単語を選択し、それがあったとしても私はgsubでそれを使うことができるかどうか分からない。

私はそれらを望む場所に\ nを追加するにはどうすればよいでしょうか?

+1

キャプチャグループを使用してそれを参照してください。 'gsub("(KEY。+?) "、" \\ 1 \ n "、文字列)'。またはより一般的な 'gsub("(KEY [、、!?]。+?) "、" \\ 1 \ n "、文字列)'。あなたがキャラクタークラスの部分 '[。、;!?]' – Jota

+1

カールにどんな句読点を入れても、あなたはあまり単純化していません。 '何かKEY、次の言葉? 「次の」単語の後に空白がない場合はどうなりますか?そして、あなたのための*単語*は何ですか? 1 +英数字/アンダースコア( '\ w +')?ハイフンとアポストロフィ「[a-zA-Z ' - ] + '? –

+0

@Jotaこれは完璧に機能しました。 – Carl

答えて

2

キャプチャグループを使用してそれを参照することができます。 WiktorStribiżewが指摘したように、特定のシナリオを処理する方法とケースの詳細を決定する必要があります。提示された例のケースでは

、スペースに続く非whitepspace文字1回以上(\\S+)に続くスペースが続くKEYを探して:あなたは、より一般的になりたい場合は

gsub("(KEY \\S+)", "\\1\n", string, perl = TRUE) 

"KEY"の後にできるものは、あなたが許可するものを含む文字クラスを追加することができます(英数字/アンダースコア以外の文字の場合は\ s、Wiktorの場合は\ W)。このような何か:

gsub("(KEY[., ;!?]\\S+)", "\\1\n", string, perl = TRUE) 
gsub("(KEY\\s\\S+)", "\\1\n", string, perl = TRUE) 
gsub("(KEY\\W+\\S+)", "\\1\n", string, perl = TRUE) 

は、文字クラスの一部にあなたが好きな句読点[., ;!?]


を置くWiktor第の変化(s)は少しより堅牢なことがあります

gsub("(KEY\\s+\\S+\\s*)", "\\1\n", string) # \s = white-space character 
              # \S = non-white-space character 
gsub("(KEY\\W+\\w+\\s*)", "\\1\n", string) # \w for alphanumeric/underscore 
              # \W for the opposite of \w. 

これらの変異体次の単語(0以上の空白文字の場合は\\s*)のあとにスペースを必要とせず、KEYの後に1つ以上の空白文字と一致するか、 KEYの後に1つ以上の非英数字/アンダースコア。

+0

この場合、 '\ S'の後ろに遅延量子を使う必要はありません。ちょうど' \ S + '(より短い、同じ性能)を使用してください。 –

+0

@WiktorStribiżewありがとう!私の答えにあなたのバリアントを含めるとどうでしょうか? – Jota

+0

ご希望の場合は、コメントです:) –

関連する問題