2016-07-27 24 views
1

Предположим, что у меня длинная строка текста, например абзац или более, и есть определенное слово, которое появляется часто, назовем его KEY.Вставьте n после слова после соответствия регулярному выражению

Я хочу вставить «\ n» после слова, которое появляется после каждого КЛЮЧА.

Так что, если у меня есть строка KEY Hello this is KEY an example. Я хочу, чтобы это выглядело как KEY Hello \nthis is KEY an \nexample

Если задача была несколько проще, и я просто хотел бы добавить \ п после KEY, то я мог бы легко сделать это с, gsub("KEY","KEY \n",string), но я не думаю, что регулярное выражение имеет элегантный способ выбрав слово после матча, и даже если это произойдет, я не уверен, что смогу использовать его в gsub.

Что было бы хорошим способом добавить \ n, где я хочу?

+1

Используйте группу захвата и обратитесь к ней? 'gsub (" (KEY. +?) "," \\ 1 \ n ", string)'. Или более общий 'gsub (" (KEY [.,;!?]. +?) "," \\ 1 \ n ", string)'. Помещая любую пунктуацию, которую вы хотите в части класса символов '[.,;!?]' – Jota

+1

Карл, вы упрощаете. Что относительно 'Некоторый КЛЮЧ, следующее слово'? Что делать, если после «следующего» слова нет места? И что для вас слово *? 1 + буквенно-цифровое/подчеркивание ('\ w +')? Или просто буквы ASCII с дефисами и апострофом '[a-zA-Z '-] +'? –

+0

@Jota Это сработало отлично. Я соглашусь, если вы ответите – Carl

ответ

2

Вы можете использовать группу захвата и вернуться к ней. Вы должны решить, как обращаться с определенными сценариями и спецификой вашего дела, как отметил Wiktor Stribiżew.

Для примера случая, представленного, поищите KEY, затем пробел, затем, не whitepspace символов 1 или более раз (\\S+) с последующим пробелом:

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

Если вы хотите быть более общий что может следовать за «KEY», тогда вы можете добавить класс символов, включая то, что вы разрешите (или \ s для любого символа пробела или \ W для любых символов, отличных от буквенно-цифровых символов или символов подчеркивания, как указывает Wiktor). Что-то вроде этого:

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) 

Собирает все, что знаки препинания вы хотите в классе символов части [., ;!?]


вариация (s) Wiktor может быть немного более надежным:

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. 

Этих вариантами не требуется пробел после следующего слова (\\s* для 0 или более символов пробела), и они могут соответствовать одному или нескольким символам пробела после KEY или один или несколько не-буквенно-цифровых символов/подчеркиваний после KEY.

+0

В этом случае не нужно использовать ленивый квантификатор после '\ S', просто используйте' \ S + '(более короткая, такая же производительность). –

+0

@ WiktorStribiżew Спасибо! если я включу ваш вариант в свой ответ? – Jota

+0

Как вы хотите, это комментарий :) –

 Смежные вопросы

  • Нет связанных вопросов^_^