2012-07-10 4 views
0

정규식을 개선하려고합니다.주위에 부정적인 모양을 이해하지 못함

내가이 문자열이 있습니다

String myString = 
    "stuffIDontWant$KEYWORD$stuffIWant$stuffIWant$KEYWORD$stuffIDontWant"; 

을 그리고 내가 원하는 이것은 단지 물건을 빼지 만들어 :

String regex = "\\$KEYWORD\\$.+\\$.+\\$KEYWORD\\$"; 

    Pattern p = Pattern.compile(regex); 
    Matcher m = p.matcher(myString); 

    if(m.find()){ 
     String result = stuff.substring(m.start(), m.end()); 
    } 

목표는 stuffIWant$stuffIWant를 얻는 것입니다 다음 문자 $로 분할, 그래서 그것을 개선하고 Patter와 Matcher를 Java 소스로 가져 오는 것을 피하기 위해 lookaround에 대해 읽었으므로 두 번째 접근법은 다음과 같습니다.

//Deletes what matches regex 
    myString.replaceAll(regex, ""); 
// Does nothing, and i thought it was just the opposite of the above instruction. 
    myString.replaceAll("(?! "+regex+")", ""); 

올바른 방법과 내 개념은 어디에 잘못됩니까?

+1

난 당신이 무엇을 lookaround 오해 생각합니다. Lookaround는 실제 문자가 아닌 텍스트의 위치 (깜박이는 커서와 같은)와 일치합니다. 이를 아무것도 대체하지 않기 때문에 실제 문자가 대체되지 않습니다. – Arjen

+0

@Arjen 감사합니다. 그런 다음 더 자세히 읽으겠습니다 (지금 당장은 시간이 없습니다). 패턴 및 매처를 사용하여 작동했던 것에 대한 더 나은 해결책이 있습니까? – Roger

+0

현재 솔루션에 어떤 문제가 있습니까? 나에게 충분히 좋은 것 같아! acheong87과 마찬가지로 캡처를 사용하여 찾은 문자열을 분할하지 않아도됩니다. – Arjen

답변

3

도착! 그러나 대부분은 캡처 그룹을 사용합니다.

\\$KEYWORD\\$(.+)\\$(.+)\\$KEYWORD\\$ 
      ^^ ^^ 

이 괄호, 그들이 둘러싸 무엇 즉 캡처를 저장합니다. 첫 번째 세트는 1로 인덱싱되고, 두 번째 세트는 2로 인덱싱됩니다. 위의 표현식으로 이것을 시도하여 어떤 일이 일어나고 있는지 확인할 수 있습니다.

if (m.find()) { 
    int count = m.groupCount(); 
    for (int i=0; i<count; i++) { 
     System.out.println(m.group(i)); 
    } 
} 

너무 lookarounds으로 해결할 수 있지만, 불필요 :

(?<=\\$KEYWORD\\$).+?\\$.+?(?=\\$KEYWORD\\$) 
^^^^   ^^  ^^^^   ^
+1

또한''(. +)''를''(. +?)''로 대체하여 _ 욕심쟁이 일치를 호출 할 수도 있습니다 ._ 하지만이 수준에서는 걱정할 필요가 없습니다. –

+0

감사합니다. 여기에 여러 가지 작업을했습니다! :디 – Roger

관련 문제