2012-06-04 3 views
1

특정 문자가 있는지 확인하여 문자열이 유효한지 유효하지 않은 지 테스트하고 있습니다. 포함하는 문자열; #/% = | + \ "<는> 내가 현재 자바에서 구현 다음했습니다. 유효하지 않은 것으로 간주,하지만 난 더 우아한 정규식 솔루션을 선호하는 것입니다.정규식을 사용하여 유효/유효하지 않은 문자열을 테스트하십시오.

내가 무슨 짓을했는지
public boolean isStringValid(String name) { 
    if ( name.contains(";") 
     || name.contains("#") 
     || name.contains("/") 
     || name.contains("%") 
     || name.contains("=") 
     || name.contains("|") 
     || name.contains("+") 
     || name.contains("\\") 
     || name.contains("\"") 
     || name.contains("<") 
     || name.contains(">")) { 
     return false; 
    } 
    else { 
     return true; 
    } 
} 

는 다음에 변경,

public boolean isNameValid(String name) { 
    return !Pattern.matches(".*(;|#|/|%|=|\\||\\+|\\\\|\"|<|>)+.*", name); 
} 

하지만. 모든 자바 이스케이프 문자에 추가하기 전에 원래 정규식 문자열은 다음과 같다,

.*(;|#|/|%|=|\||\+|\\|"|<|>)+.* 

는 문자 c를 사용하여 바로 정규식 문자열을 얻이 수없는 것 필자의 경우 "d @ vik"과 같은 이름이 유효한 것으로 간주되기 때문에 [A-z]와 같은 lasses는 옵션으로 보이지 않습니다.

+2

무언가를 확인하고 싶을 때, 무효의 경우보다 유효성을 확인하는 것이 좋습니다. – popfalushi

+0

@popfalushi 나는 보통 당신과 동의 할 것이지만, 나는 주어진 사양에 기반한 자동화 된 테스트 스크립트를 작성하고있다. 개발자들이 염두에 두었던 것을 누가 압니까? ;) – hitsuyashi

답변

1

당신은 거의 맞다. matches() 대신 find() 메서드를 사용하십시오. 그리고 패턴을 한 번만 컴파일하십시오. 이것은 가장 비싼 작업입니다. 그리고 당신은 []을 사용하면 패턴을 단순화 할 수 있습니다 :이 경우에 당신은 당신이 찾고있는 서브 패턴 사이 |를 작성할 필요가 없습니다 :

이제
private static Pattern validator = Pattern.compile("[;%#=\\+]"); // etc: write all characters you need. 

당신에게 isNameValid()을 다시 쓰기 다음과 같이

public boolean isNameValid(String name) { 
    return !validator.find(); 
} 

BTW는 백 슬래시에주의를 기울이십시오. 패턴에 백 슬래시를 포함하려면 패턴을 4 회 작성해야합니다. 정규식 이스케이프의 경우 두 번이고 자바 이스케이프의 경우 두 번입니다.

+1

+1을 찾으십시오. 하지만 패턴이 완벽하지 않아서, Pattern.compile ("[; #/% = \\ | \\\ \\\\"<>] ") ' –

+0

@RolandBouman, 문자 클래스 내에서'+'와'|'를 이스케이프해야합니다. – stema

+0

@RolandBouman and AlexR 두 가지 모두 감사합니다. 한 가지, Validator 클래스에는 find()가없는 것 같지만 반환 코드는 다음과 같이 보일 것입니다 : return! validator.matcher (name) .find(); 내가 틀렸다면 나에게 정정하십시오. 아니면 대답을 받아 들일 수 있을지 알려주세요 :) – hitsuyashi

1

당신은 문자 클래스를 부정 할 수

Pattern.matches("[^;#/%=|+\\\\\"<>]+", name); 
관련 문제