2013-08-27 4 views
2

오래전 나는 "bad"문자의 인스턴스에 대해 String 인수를 검사하는 detectBadChars(String)이라는 메서드를 작성했습니다.기존 Java 정규 표현식에 공백 처리 추가

나쁜 문자의 원래 목록이었다

  • '~'
  • '#'
  • '@'
  • '*'
  • '+'
  • '% '

내 방식은 훌륭하게 작동합니다. : 비즈니스 로직은 이제 변경, 다음과 같은있다

// Detects for the existence of bad chars in a string and returns the 
// bad chars that were found. 
protected String detectBadChars(String text) { 
    Pattern pattern = Pattern.compile("[~#@*+%]"); 
    Matcher matcher = pattern.matcher(text); 

    StringBuilder violatorsBuilder = new StringBuilder(); 

    if(matcher.find()) { 
     String group = matcher.group(); 
     if (!violatorsBuilder.toString().contains(group)) 
      violatorsBuilder.append(group); 
    } 

    return violatorsBuilder.toString(); 
} 

지금 도 나쁜 것으로 간주 :

  • 캐리지 리턴 (\r)
  • 새 라인 (\n)
  • 탭 (\t)
  • 임의의 연속 공백 (" ", " " 등)

그래서 새로운 잘못된 문자를 수용하기 위해 정규식을 수정하려고합니다. 정규식을 다음으로 변경 :

Pattern pattern = Pattern.compile("[~#@*+%\n\t\r[ ]+]"); 

... 예외가 발생합니다. 내 생각에 정규 표현식에 "\ n \ t \ r"을 추가하면 개행 문자, 탭 및 CR이 각각 할당됩니다. 그리고 나서 "[ ]+"을 추가하면 공백으로 구성된 새로운 "클래스/그룹"을 추가 한 다음 해당 공백을 1 개 이상 허용하는 것으로 그룹화하여 효과적으로 연속 된 공백을 처리합니다.

어디서 awyre가되고 내 정규식은 무엇이되어야합니까 (이유)? 미리 감사드립니다!

답변

6

그냥 \\s을 사용하여 모두를 설명합니다. 그리고 1 이상의 반복에 맞게, 전체 문자 클래스에 + 정량을 추가

Pattern.compile("[~#@*+%\\s]+"); 

참고 자바, 당신은 백 슬래시를 이스케이프 할 필요가있다. 따라서 \\s이고 \s이 아님.

+0

아아! 2 초 동안! (+1) – Gamb

+0

@Gamb. OOP.:) –

+2

+1 또한 백 슬래시 자체를 이스케이프해야하기 때문에 예외가 throw됩니다. – MByD

-1

나는 이것이 작동해야한다고 생각한다.

Pattern.compile("[~#@*+%\n\t\r\\s{2,}]"); 

연속되는 공백과 일치 시키려면 \\ s {2,}가 필요합니다.

편집 : 나는 위의 실수를했습니다. 그것을 지적한 Alan Moore에게 감사드립니다. 다음은 새로운 솔루션입니다.

Pattern.compile("[~#@*+%\n\t\r]|\\s{2,}") 
+1

문자 클래스 안에서'{2,}'는 * 2 개 이상을 의미하는 한정 기호가 아니며'{','2',',','}'와 같은 리터럴 문자 목록 일뿐입니다. –