2009-09-07 2 views
1

최근에 Java에서 정규 표현식의 오류라고 생각했던 코드를 만들었지 만 코드를 테스트 할 때 예상 한 오류가 발생하지 않습니다.이스케이프 처리되지 않은 "." 부정적인 그룹에서 사용될 때도 여전히 일치합니다.

내가 만든 표현은 다른 소스에서받은 문자열의 암호를 대체하기위한 것입니다. 내가 사용한 패턴은 "password : [^ \\ s.] *"의 줄을 따라 갔다. "password"라는 단어는 콜론, 스페이스, 스페이스 또는 완전 정지 (마침표). 그런 다음 인스턴스를 "password : XXXXXX"로 바꾸고 마스크 처리합니다.

명백한 오류는 내가 풀 스톱을 벗어나는 것을 잊어 버린 것입니다. 다른 말로하면 올바른 표현은 "password : [^ \\ s \\.] *"이어야합니다. 제가 코드를 완전히 벗어나지 않으면 코드가 여전히 작동합니다!

여기에 몇 가지 예제 코드는 다음과 같습니다

import java.util.regex.*; 

public class SimpleRegexTest { 

    public static void main(String[] args) { 
     Pattern simplePattern = Pattern.compile("password: [^\\s.]*"); 
     Matcher simpleMatcher = simplePattern.matcher("password: newpass. Enjoy."); 
     String maskedString = simpleMatcher.replaceAll("password: XXXXXX"); 
     System.out.println(maskedString); 
    } 

} 

나는 다음과 같은 출력 얻을 위의 코드를 실행하면 :

password: XXXXXX. Enjoy. 

이, 특별한 경우인가 또는 내가 완전히 뭔가를 놓친를?

(편집 : "마침표 탈출"로 변경)

마이클 Borgwardt : 내가 모호성 죄송합니다 "부정 그룹"에서 떨어져 무엇을하고 있었는지 설명하는 다른 용어 생각하지 못했습니다.

에비 에이터 :이 경우, 아니요, 공백은 암호에 포함되지 않습니다. 나는 규칙을 만들지 않았다 ;-). 이중 슬래시를 고정 :

다르 -

(/ 편집 :이 제대로 표시되도록 비 코드 텍스트에 슬래시를 두 배로 코드에서 ^이었다 추가가 아니라 텍스트) 그래서 자신의 탈출 문자가있는 것 같습니다.

+1

당신의 질문은 약간 혼란 스럽습니다. 당신은 텍스트에 부정 그룹을 사용하고 있지 않습니다. 당신은 말하자면, 당신이 의미하는 것보다 "공간"을 피하는 것에 대해 이야기합니다. –

+0

하나의 쿼리가 있습니다. 암호 문자로 공백을 둘 수 없습니까 ?? 왜 그것을 제외하고 있습니까? – vpram86

+0

Kurley, 나는 당신이 Michael Borgwardt의 요점을 잃어 버렸다고 생각한다 : 당신은 코드에서 [^ \\ s.] *를 사용하지만 위의 텍스트에는^기호가없는 [\ s.] *를 사용한다. 텍스트의 오타라고 생각합니다. 많은 혼란을 불러 일으키므로 수정하십시오. – sundar

답변

10

마침표 ('.'문자)는 정규식의 문자 클래스 [] 안에서 이스케이프 할 필요가 없습니다. API에서

: 메타 문자의 다른 세트는 문자 클래스 외부보다 문자 클래스 내부에 적용되는 것을

참고. 예를 들어, 정규 표현식. 문자 클래스 내에서 특별한 의미를 잃지 만 표현식은 메타 문자를 구성하는 범위가됩니다.

+0

사실 그건 사실입니다. 원래 그가 도망 가지 않고 시도했기 때문에 원래의 문제는 아닙니다. 어쨌든 참고 +1. :) –

+0

@dtsazza : 저는 원래 문제였습니다. 문제는 왜 이스케이프 처리되지 않은 기간이 작동하는지에 관한 것이고, Avi는 답변을주었습니다. – sundar

+0

이것은 내가 찾고있는 대답이었고, 자바 API에서 Regex 페이지를 많이 보았지만 여전히 Avi가 게시 한 단락을 발견하지 못했습니다. Avi에게 감사드립니다. – Kurley

0

정규식 범위에 대해 부정 연산자가 혼합 된 것처럼 보입니다.

특히, 내 이해는 스 니펫 [\s.]*을 사용하여 "공백 또는 전체 정지 (마침표)를 제외한 모든 문자"를 의미합니다. 실제로는 [^ .]*으로 표시되며, 캐럿을 사용하여 세트의 문자를 무효화합니다.

귀하의 게시물에 오타가 있거나 실제로 코드에 입력 된 내용인지는 모르지만 질문에 나오는 정규식은 "암호", 콜론, 공백과 일치합니다 모든 백 슬래시 문자, "s"문자 또는 마침표.

관련 문제