2015-02-07 4 views
1

I은 ​​할 문자열 A = "-g (KP-OL) F A + (JP-NL) + H (죠 NK) - B + E (KP 올) -g (IP-ML) + H (IO-MK) + CE (JP-NL) " 이용한 문자 사이의 문자를 삭제하기 정규식

가 지금은 제거 +/- 문자 사이의 문자가 곱처럼 보이게합니다. (예) dis 문자열에서 + f를 af..remove +로 변환합니다 ... 전체 문자열에 대해서도 마찬가지입니다.

누구는 단어 문자와 단어가 아닌 문자 간의 일치 단어 경계 \b 의해 정규식

+0

괄호 밖의 문자 사이에서만 문자를 제거하고 싶습니까? – hwnd

+0

괄호 밖에 바깥뿐입니다. – lpd

답변

1
([a-zA-Z])[+-](?=[a-zA-Z])(?![^(]*\)) 

demo를 참조하십시오. 바꾸기 : $1.

이 문자는 +- 부호 앞에 문자를 캡처하고 미리보기를 사용하여 "그 뒤에 문자가 있습니다"라고 주장합니다. "("뒤에 ")이 없어야합니다"라는 괄호 안에 다른 미리보기가 삽입됩니다. 캡쳐 된 문자는 $1에 저장되어 있으므로 나중에 바뀝니다.

캡쳐 그룹 대신 긍정적 인 lookbehind를 사용할 수 있습니다.

(?<=[a-zA-Z])[+-](?=[a-zA-Z])(?![^()]*\)) 

자바 정규식,

"(?<=[a-zA-Z])[+-](?=[a-zA-Z])(?![^()]*\\))" 

수 그리고 빈 문자열이 일치하는 + 또는 - 문자를 대체 할 것이다.

0

서라운드 + 또는 -를 이용한 솔루션을 제안 할 수있다.

String s = "a+f(kp-ol)-g(jp-nl)+h(jo-nk)-b+e(kp-ol)-g(ip-ml)+h(io-mk)+c-e(jp-nl)"; 
System.out.println(s.replaceAll("\\b[-+]\\b", "")); 

출력 :

af(kpol)-g(jpnl)+h(jonk)-be(kpol)-g(ipml)+h(iomk)+ce(jpnl) 

DEMO

는 paranthesis의 외부에 존재하는 단어 경계로 둘러싸인 모든 + 또는 - 문자와 일치합니다.

"\\b[-+]\\b(?![^()]*\\))" 

예 :

String s = "a+f(kp-ol)-g(jp-nl)+h(jo-nk)-b+e(kp-ol)-g(ip-ml)+h(io-mk)+c-e(jp-nl)"; 
System.out.println(s.replaceAll("\\b[-+]\\b(?![^()]*\\))", "")); 

출력 :

af(kp-ol)-g(jp-nl)+h(jo-nk)-be(kp-ol)-g(ip-ml)+h(io-mk)+ce(jp-nl) 
관련 문제