2013-02-12 2 views
17

tesseract ocr에서 가져온 일부 이메일을 수정하고 있습니다.String.replaceAll()이 작동하지 않습니다.

여기 내 코드입니다 :

if (email != null) { 
     email = email.replaceAll(" ", ""); 
     email = email.replaceAll("caneer", "career"); 
     email = email.replaceAll("canaer", "career"); 
     email = email.replaceAll("canear", "career"); 
     email = email.replaceAll("caraer", "career"); 
     email = email.replaceAll("carear", "career"); 
     email = email.replace("|", "l"); 
     email = email.replaceAll("}", "j"); 
     email = email.replaceAll("j3b", "job"); 
     email = email.replaceAll("gmaii.com", "gmail.com"); 
     email = email.replaceAll("hotmaii.com", "hotmail.com"); 
     email = email.replaceAll(".c0m", ".com"); 
     email = email.replaceAll(".coin", ".com"); 
     email = email.replaceAll("consuit", "consult"); 
    } 
    return email; 

그러나 출력이 올바르지 않습니다.

입력 :

[email protected] mai|.com 

출력 :

[email protected]|l.lclolml 

하지만 모든 교체 후 새 문자열로 결과를 할당 할 때, 그것은 잘 작동합니다. 동일한 String에서 연속 할당이 작동하지 않는 이유는 무엇입니까?

+0

내가 복사/다음 regex에 의해 단어 career의 isspellings, 그것은 올바른 결과로 보이는 결과에 (라인 5에 오타 수정) 것을 붙여 넣습니다. [email protected] "을 클릭하십시오. – Ren

+3

replaceAll 대신 String.replace를 사용해보십시오. replaceAll이 기대하는 바를 정확히 믿습니다. – Buhb

+2

내 눈은 그런 식의 코드를 보면서 아플 것입니다. –

답변

34

Javadoc for String.replaceAll()에서 첫 번째 인수는 regular expression입니다.

마침표 (.)는 중괄호 (})처럼 파이프 (|)와 마찬가지로 특별한 의미가 있습니다. 당신은 다음과 같이 \\.에 의해 .을 탈출해야

email = email.replaceAll("gmaii\\.com", "gmail.com"); 
+0

탈출해야 하나? 및 { – Neeraj

+3

예. 그러므로 "너는 모두 그들을 피할 필요가있다." –

+1

나는 탈출했다. 작성자 : \\ | 그러나 여전히 대체되지는 않습니다. 그 밖의 모든 것은 잘 작동합니다. – Neeraj

5

: 당신은 같은 그들 모두를 탈출 할 필요가 당신은 몇 가지 정규식 문자를 사용하는

if (email != null) { 
    email = email.replaceAll(" ", ""); 
    email = email.replaceAll("caneer", "career"); 
    email = email.replaceAll("canaer", "career"); 
    email = email.replaceAll("canear", "career"); 
    email = email.replaceAll("caraer", "career"); 
    email = email.replaceAll("carear", "career"); 
    email = email.replace("|", "l"); 
    email = email.replaceAll("}", "j"); 
    email = email.replaceAll("j3b", "job"); 
    email = email.replaceAll("gmaii\\.com", "gmail.com"); 
    email = email.replaceAll("hotmaii\\.com", "hotmail.com"); 
    email = email.replaceAll("\\.c0m", "com"); 
    email = email.replaceAll("\\.coin", "com"); 
    email = email.replaceAll("consuit", "consult"); 
} 
return email; 
3

.

그들을 \를 사용하거나 Pattern.quote 방법

4

난 당신이 replaceAll의 첫 번째 매개 변수는 정규 표현식 것을 인식하지 못합니다 생각을 사용하여 탈출하십시오.

., |, }은 예상과 다른 방식으로 해석 될 수 있습니다.

. Any character (may or may not match line terminators) 
공간

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

당신은 더 나은 선도적 인 \\

10

(이 자바인가?)

참고로 다른 특수 문자를

\s A whitespace character: [ \t\n\x0B\f\r] 

를 사용하고 탈출에 그 Java, replaceAll은 정규 표현식을 허용하고 do t는 모든 문자와 일치합니다.replaceAll() 첫 번째 인수는 당신이 당신의 비교를 할 수 regex 것을 실현함으로써

email = emai.replaceAll("canear", "career"); 

email = email.replaceAll("canear", "career"); 
+0

네, 자바. 그 오타 오류를 언급 해 주셔서 감사합니다. 수정했습니다 – Neeraj

6

해야한다 : 당신은 또한 여기에 오타주의 점을 탈출 또는

somestring.replaceAll(Pattern.quote("gmail.com"), "replacement"); 

를 사용할 필요가 훨씬 적음

예를 들어 가능한 m "amrut = AC -

email = email.replaceAll("ca[n|r][e|a][e|a]r", "career"));

+0

이 도움을 주셔서 감사합니다. – Neeraj

+0

환영합니다 – iTech

+0

'[nr]'및 Co가 아닌'[n | r]'및 친구 여야합니까? –

관련 문제