2016-07-27 5 views
1

단락과 같이 긴 텍스트 문자열이 있고 자주 나타나는 특정 단어가 있다고 가정 해 봅시다. KEY를 호출 할 수 있습니다.정규 표현식 일치 단어 뒤에 n을 삽입하십시오.

각 키 다음에 오는 단어 뒤에 "\ n"을 삽입하고 싶습니다.

문자열이 KEY Hello this is KEY an example 인 경우. 그것처럼 보이길 바란다 KEY Hello \nthis is KEY an \nexample

만약 작업이 약간 더 간단하다면, 나는 단지 KEY 후에 \ n을 추가하기를 원한다. 나는 그걸 쉽게 할 수있다. gsub("KEY","KEY \n",string)하지만 정규식은 우아한 방법이 없다고 생각한다. 경기 후 단어를 선택하고, 심지어 그랬더라도 gsub에서 사용할 수 있을지 잘 모르겠다.

내가 원하는 곳에 \ n을 추가하는 좋은 방법은 무엇입니까?

+1

캡처 그룹을 사용하고 참조 하시겠습니까? 'gsub ("(KEY. +?)", "\\ 1 \ n", 문자열)'. 또는 더 일반적인'gsub ("(KEY [,,!?]. +?)", "\\ 1 \ n", string)'. 캐릭터 클래스 부분에 원하는 구두점을 넣으십시오. [.,;!?] – Jota

+1

Carl, 당신은 지나치게 단순화하고 있습니다. 'Some Key, next word'는 어때? "다음"단어 다음에 공백이 없으면 어떻게 될까요? 그리고 당신을위한 단어 *는 무엇입니까? 1+ 영숫자/밑줄 ('\ w +')? 또는 하이픈과 아포스트로피가있는 ASCII 문자'[a-zA-Z '-] +'? –

+0

@Jota 완벽하게 작동했습니다. 나는 당신이 대답을하면 그것을 받아 들일 것이다 – Carl

답변

2

캡처 그룹을 사용하여 다시 참조 할 수 있습니다. Wiktor Stribiżew가 지적한대로 특정 시나리오와 사례의 처리 방법을 결정해야합니다. 있는 예시 사례를 들어

, 다음에 공백이 아닌 whitepspace 문자가 1 번 이상 ( \\S+) 다음에 공백 키를 찾습니다 :

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

당신이 더 일반적인 싶은 경우 "KEY"를 따라갈 수있는 것을 허용한다면, 허용 할 것을 포함하는 문자 클래스를 추가 할 수 있습니다. (Wiktor가 가리키는 것처럼 영숫자/밑줄 문자에 대해서는 \ s를 사용합니다. 이런 식으로 뭔가 :

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의 변화 (들) 좀 더 강력한 될 수 있습니다

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 나 공백 문자 뒤에 공백 문자가 하나 이상 일치 할 수 있습니다. KEY 다음에 하나 이상의 영숫자/밑줄이 있습니다.

+0

이 경우'\ S' 다음에 lazy 수량 한정자를 사용할 필요가 없습니다.'\ S +'(더 짧고 동일한 성능)를 사용하십시오. –

+0

@ WiktorStribiżew 감사! 내 답변에 변형을 포함 시키십시오. – Jota

+0

원한다면, 그것은 의견입니다 :) –