2010-04-09 8 views
5

에있는 사람과 일치하지 않는 문자 나는이 정규식이 대체 :정규식

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 

내 문자열이 정규식과 일치하는 경우 내가 확인하지 않을 경우, 여기가 아닌 모든 문자를 대체 할, "_"와 함께.

내가 좋아하는 시도했다 :

private static final String SPACE_PATH_REGEX_EXCLUDE = 
     "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 
if (myCompanyName.matches(SPACE_PATH_REGEX)) { 
    myNewCompanySpaceName = myCompanyName; 
} else{ 
    myNewCompanySpaceName = myCompanyName.replaceAll(
      SPACE_PATH_REGEX_EXCLUDE, "_"); 
} 

그러나 그것은 작동하지 않습니다 ..., 다음과 같은 문자를 생략하지 않는 것 같다 2 정규식 "~"그렇게.

아이디어가 있으십니까?

답변

8

당신은 당신의 정규식 (규칙에 대한 Pattern class 참조) 몇 가지 문제가 : 문자 클래스 내부

  • | 특별한 의미가 없습니다 당신은 당신의 성격을하지 않으려면 (귀하의 경우 교체없이 제거해야 문자에 | 문자가 포함 된 클래스).
  • 마찬가지로 문자 클래스 내에서 /, _+을 이스케이프 할 필요가 없습니다.
  • -
  • 는 단지 그것을 마지막 문자
  • ~ 아니라 그냥 자신을 나타내는 문자 클래스에서 특별한 의미가 없습니다 아니라면 탈출 할 필요가
  • 당신이 문자 그룹의 내용을 부정하는 ^를 사용하는 것이 좋습니다. 아무것도 어쨌든 일치하지 않는 경우 replaceAll() 호출이 수정되지 않은 문자열을 반환로

또한, 최초의 matches() 검사를 건너 뛸 수 있습니다. 그것을 지키면 (그리고 두 번째 정규 표현식) 버그를 숨길 수있는 다른 장소를 소개하는 역할을합니다 (예를 들어 실수로 한 정규 표현식을 업데이트 할 수 있지만 다른 정규 표현식은 업데이트 할 수없는 경우).

+0

분명히 설명해 주셔서 감사합니다. –

4

보십시오 : 당신이 당신의 패턴으로 불필요한 |의 퍼팅 것을

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]"; 
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_"); 

당신이 가진 가장 큰 문제입니다. 그것들은 다른 의미를 가지고 있습니다. 또한 \w을 사용하여 표현을 크게 단순화 할 수 있습니다.이 단어는 문자 (대문자 또는 소문자), 숫자 또는 밑줄을 의미하는 "단어 문자"를 의미하며 [A-Za-z0-9_]과 동의어입니다.

또한 탈출 작동 원리를 이해해야합니다. Java 문자열 이스케이프가 있기 때문에 \\에 패턴에 백 슬래시를 하나 넣어야합니다. 하지만 정규 표현식도 벗어납니다. 예를 들어 \n은 자바 문자열 줄 바꿈 문자이고 \\n은 줄 바꿈 문자를 찾기위한 패턴에 \n을 넣는 시퀀스입니다.

  1. 당신은 \Q...\E를 사용할 수 있습니다

    당신은 텍스트의 무리를 탈출하기위한 두 가지 편리한 옵션이 있습니다.\Q\E 사이의 값은 이스케이프됩니다.

  2. Pattern.quote()을 사용하면 임의의 문자열을 인용 할 수 있습니다.

regexes의 특정 시퀀스를 이스케이프 처리해야하는 곳은 문맥 적입니다. 예를 들어 -은 범위를 나타내는 것으로 오인 될 수있는 경우에만 이스케이프해야합니다. [a-z]은 소문자입니다. [a\-z]a, - 또는 z 중 하나입니다. 그러나 -[a-z]을 사용하여 하이픈과 소문자를 표시 할 수 있습니다. 참고 : 첫 번째 하이픈을 이스케이프 할 필요가 없습니다.

+0

'-'를 벗어나야한다고 생각합니다. –