2012-10-09 3 views
2

이 질문은 내가 생각하기에이 포럼에서 또 다른 질문의 파생물이지만, 결국은 어려운 것으로 밝혀졌습니다.정규식 검색은 어떻게 작동합니까?

OP는 xyz의 모든 부분 문자열 <tagname>xyz</tagname>NEW TEXT으로 바꿔야합니다.

String str="<tagname>bgerh</tagname>sdfghuhjg<tagname>bgew</tagname>rwesdgrhtf<tagname>bfgh</tagname>"; 

System.out.println(str.replaceAll("(?<=(<tagname>)).*(?=(</tagname>))","NEW TEXT")); 

출력은 내가 가진 : 분명히 원하는 것이 아니다

<tagname>NEW TEXT</tagname> 

나는 다음과 같은했다.

그래서 정규 표현식 검사가 문자열의 양쪽 끝에서 발생하는지 알고 싶습니다. 예제에 대한 해결책으로 기뻐할 것입니다. 미리 감사드립니다.

답변

6

.*은 욕심쟁이 양이 많아서 가능한 모든 것을 의미합니다. 샘플 문자열은 <tagname>으로 시작하고 </tagname>으로 끝나기 때문에 그 중간에있는 모든 문자는 .*과 일치합니다.

이 문제를 해결하려면 대신 마지 못해 한정 기호를 사용할 수 있으며 가능한 한 적게 붙입니다. 꺼린 규정은 다음과 같습니다 .*?, 따라서 전체 표현식은 다음과 같이 보일 것이다 : 나는 보통 정규 표현식의 내부에서 <을 제외하여이 작업을 수행 할 것

"(?<=<tagname>).*?(?=</tagname>)" 
+2

플러스의 일반적인주의 사항 : 중첩 된 태그가 발생하자마자 모든 것이 고장납니다. 정규 표현식은 XML과 같은 중첩 구조를 처리하는 도구가 아닙니다. –

+1

나는 불필요한 내부 괄호를 제거하기 위해 자유를 택했습니다. –

1

. Like :

(?<=<tagname>)[^<]*(?=</tagname>) 
관련 문제