2010-04-13 4 views
2

이것은 이전의 노력 (wordEndsrepeatEnd)과 유사합니다. 정신 운동으로 정규 장난감을 사용하여 장난감 문제를 해결하고 싶습니다.codingBat plusOut using regex

Description from codingbat.com : 문자열과 비어 있지 않은 단어 문자열을 감안할 때

이 단어 문자열의 외관을 제외한 모든 문자가 흑자 ("+"를)로 대체 된 원래 문자열의 버전을 반환하는 변경되지 않고 보존됩니다. 중복을 허용할지 여부에 대한 언급이 없습니다

plusOut("12xy34", "xy") → "++xy++" 
plusOut("12xy34", "1") → "1+++++" 
plusOut("12xy34xyabcxy", "xy") → "++xy++xy+++xy" 

(? plusOut("+xAxAx+", "xAx") 것입니다 예를 들어), 그러나 나의 비 정규식 솔루션은 중복을 처리하지 않습니다 그것은 통과, 그래서 우리가 비 가정 할 수 있습니다 추측 오버레이가 발생하면 word으로 단순화됩니다 (두 변종에 대한 솔루션을 제공하면 보너스 포인트가 적용됩니다!).

어쨌든이 정규식을 사용하여 (다른 두 가지 문제로 이전에했던 것과 같은 스타일의) 문제를 해결하고 싶습니다. 그러나 나는 완전히 혼란 스럽습니다. 나는 아무것도 보이지 않는다. 왜냐하면 나는 아무 것도하지 못하기 때문이다.

그럼 stackoverflow 커뮤니티가 무엇인지 생각해 봅시다.

답변

2

이 모든 테스트를 통과 : 그게 내가뿐만 아니라 당신의 중복 시험을 통과하면 다음 찾고 있던 결과의 경우

plusOut("1xAxAx2", "xAx") → "+xAxAx+" 

,하지만 난에 있습니다 또한

public String plusOut(String str, String word) { 
    return str.replaceAll(
    String.format("(?<!(?=\\Q%s\\E).{0,%d}).", word, word.length()-1), 
    "+" 
); 
} 

를, 내가 얻을 우연히 그 사람이 인정합니다. : D

+0

나는'\ G'를 뒤돌아 보면서 놀랐다. (이전 문자가 일치하지 않으면'word'의 범위 내에 있다면 일치 할 수 없다.), 아마도 해결할 수있다. 논 오버랩 변이 형. 또한 이전에 나는 또한 당신과 비슷한 것을 시도했지만 유한 rep (그것은'repeatBegin'과 함께했던 문제이기도합니다) 후에 긍정적 인 미리보기를 넣는 실수로 시도했습니다. 어쨌든, 다시 잘 했어! 나는 이것을 doublevote 할 수 있으면 좋겠다! – polygenelubricants

+0

한 가지 질문 :'\ Q'와'\ E'를 사용하여 임의의 입력 문자열을 인용하는 것이 얼마나 안전할까요? 예를 들어,''\\ E ''와 같이 단어가''\\ E' '이면 해결책이 깨질 것입니다. – polygenelubricants

+1

@poly : 예, 완전히 안전하려면'wordEnds' 솔루션에서했던 것처럼'quote()'메소드를 사용해야합니다. 그것은 실제로'\ Q'와'\ E'를 추가함으로써 작동하지만 이미 존재할 수도있는'\ E'를 이스케이프합니다. –

-1

네가 부정적인 범위를 활용할 수 있다고 생각합니다. 이것은 힌트 일 뿐이므로 테스트하지는 않았습니다! "[^xy]"

을 ... 그리고 "+"과 그 표현과 일치 문자열을 대체하는 정규 표현식에 그 포장 :

이 같은 정규 표현식으로 "xy"을 돌려

.

+0

작동하지 않습니다. ''xy ''_string_는 정확히 저장되어 있어야합니다. 'x'뿐만 아니라'y'도 마찬가지입니다. 가능하면 codingbat에 대한 해결책을 테스트하십시오. – polygenelubricants

+0

죄송합니다. 나는 급하게 문자열을 완전한 문자열이 아닌 일치하는 문자 집합으로 읽습니다. 미안 해요, 포기 해요! –

+0

시험해 주셔서 감사합니다! 나는 정말로 그것을 바르게 평가한다! 대부분의 사람들은이 어리석은 작은 운동을 무시할 것입니다! – polygenelubricants

0

참고 용으로 여기에 제공됩니다. 이것은 본질적으로 Alan의 솔루션이지만 String.format 대신 replace을 사용합니다. \G를 사용

public String plusOut(String str, String word) { 
    return str.replaceAll(
    "(?<!(?=word).{0,M})." 
     .replace("word", java.util.regex.Pattern.quote(word)) 
     .replace("M", String.valueOf(word.length()-1)), 
    "+" 
); 
} 
0

극히 간단한 해결책 :

word = java.util.regex.Pattern.quote(word); 
return str.replaceAll("\\G((?:" + word + ")*+).", "$1+"); 

은 다소주의있다. 위의 구현을 사용하여 plusOut("12xxxxx34", "xxx")을 호출하면 ++xxx++++가 반환됩니다.

어쨌든, 그런 경우 처음에는 문제가 명확하지 않습니다. 이러한 상황에 대한 테스트 사례도 없습니다 (내 프로그램이 모든 테스트 사례를 통과 한 이후).

정규식은 기본적으로 (모든 테스트 케이스를 통과) 루핑 용액과 동일하다 :

StringBuilder out = new StringBuilder(str); 

for (int i = 0; i < out.length();) { 
    if (!str.startsWith(word, i)) 
     out.setCharAt(i++, '+'); 
    else 
     i += word.length(); 
} 

return out.toString(); 

반복적는 word의 프리픽스가없는 경우, 현재의 문자를 대체 상기 word를 건너 뛴다.