2011-03-10 6 views
1
안녕하세요 내가 문자열 예의 단일 발생을 교체해야

:정규식 매치 단지 하나의 문자열의 발생이

일부 문장 #x를, #x를, #x를; # x; #x; 일부 #x; words #x;을 교체해야합니다.

#x;에 의해 #y; #x를; #x를 문자열

일부 문장 #x를 다음 얻을;와 #x; #x; 일부 #y; 단어 #y;을 교체해야합니다.

일부 참고 사항 : 내 문자열에는 유니 코드 문자가 포함되며 연산자 \ b는 작동하지 않습니다.

+0

사용하려는 코드를 표시하십시오. – HBP

답변

2

당신은 일치 할 경우에만 lookaheads를 사용하는 대신이 해결 방법을 시도 할 수 있도록

/(?<!#x;)#x;(?!#x;)/ 

그러나 자바 스크립트 lookbehinds을 지원하지 않습니다 #엑스; 여러 번 반복하고 한 번 발생하는 위치 만 교체 :

sentence = sentence.replace(/((?:#x;)+)/g, function(m) { 
    return m.length == 3 ? '#y;' : m; 
}); 
+0

+1 :이 방법은 둘러보기 해결 방법보다 낫다고 생각합니다. 확실히 읽기가 훨씬 쉽습니다. –

+0

답변 해 주셔서 감사합니다. 정말 도움이되었습니다. – Ilya

2

#x;의 단일 발생과 일치하는 가장 간단한 정규식은 lookbehind 및 lookahead 어설 션을 사용하는 것입니다.

/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/ 

전체 예제 :

> s = 'Some sentence #x;#x;#x; with #x;#x; some #x; words #x; need in replacing.' 
> s = s.replace(/(^[\S\s]{0,2}|(?!#x;)[\S\s]{3})#x;(?!#x;)/g, '$1#y;') 
"Some sentence #x;#x;#x; with #x;#x; some #y; words #y; need in replacing." 
0

사용 str.replace('/(#x;)+/g','#y;')

+1

''/ # x; {1}/''이 아니라'/ (# x;) {1}/g'을 의미한다고 생각하지만'{1}'은 여전히 ​​각각을 바꾸지 못합니다 그것의 출현은 자신의 것입니다. – Guffa

+0

@Guffa 네, 저, 정정 해 주셔서 고마워요. :) – diEcho

+0

아직 주위에 아포스트로피가있어서 정규 표현식이 아니고 문자열입니다. '# (x);가 아닌 문자열에서'/ (# x;) +/g' 텍스트를 찾을 것입니다. '{1}'에서'+ '로 바꾼다는 것은'#y; #y; #y; 대신에'#x; #x; #x;'를'#y;'로 대체한다는 것을 의미합니다. 여전히 한 번의 출현을 대체하지 못할 것입니다. – Guffa

1

단일 #x;이 전후에 공백을함으로써 자격을 수 있습니다. 이 경우 다음을 사용할 수 있습니다.

str.replace(/(\s+)#x;(\s+)/g, '$1#y;$2') 
+0

답변을 주셔서 감사하지만 문장에 공백이 없어야합니다. – Ilya

관련 문제