java - 특수문자 - 자바 배열



문자열에 잘못된 문자가 포함 된 경우 반환 할 Java 함수 (4)

문자열의 모든 문자를 검사하는 메서드가 필요합니다.

문자 단위로해야하는 경우 regexp는 아마도 좋은 방법이 아닙니다. 그러나 "블랙리스트"의 모든 문자는 128보다 작은 코드를 가지므로 작은 boolean 배열로 처리 할 수 ​​있습니다.

static final boolean blacklist[] = new boolean[128];

static {
    // Unassigned elements of the array are set to false
    blacklist[(int)'~'] = true;
    blacklist[(int)'#'] = true;
    blacklist[(int)'@'] = true;
    blacklist[(int)'*'] = true;
    blacklist[(int)'+'] = true;
    ...
}

static isBad(char ch) {
    return (ch < 128) && blacklist[(int)ch];
}

https://code.i-harness.com

나는 다음과 같은 성격의 사람들을 "불법"으로 간주하고 싶다.

~ , # , @ , * , + , % , { , } , < , > , [ , ] , | , , , \ , _ , ^

문자열을 검사하고 해당 문자열에 이러한 불법 사항이 포함되어 있는지 ( true / false )를 결정하는 메서드를 작성하고 싶습니다.

public boolean containsIllegals(String toExamine) {
    return toExamine.matches("^.*[~#@*+%{}<>[]|\"\\_^].*$");
}

그러나 간단한 matches(...) 확인은 적합하지 않습니다. 문자열의 모든 문자를 검사하여이 문자 중 하나가 아닌지 확인하는 방법이 필요합니다. 물론 나는 다음과 같이 무서운 것을 할 수있다.

public boolean containsIllegals(String toExamine) {
    for(int i = 0; i < toExamine.length(); i++) {
        char c = toExamine.charAt(i);

        if(c == '~')
            return true;
        else if(c == '#')
            return true;

        // etc...
    }
}

이것을 달성하기위한보다 우아하고 효율적인 방법이 있습니까?


모든 검증 과정에서 regex를 재 컴파일하지 않으려면 상수 를 사용하십시오.

private static final Pattern INVALID_CHARS_PATTERN = 
                               Pattern.compile("^.*[~#@*+%{}<>\\[\\]|\"\\_].*$");

코드를 다음으로 변경하십시오.

public boolean containsIllegals(String toExamine) {
    return INVALID_CHARS_PATTERN.matcher(toExamine).matches();
}

이것은 Regex에서 가장 효율적인 방법입니다.


여기서 PatternMatcher 클래스를 사용할 수 있습니다. 필터링 된 모든 문자를 문자 클래스에 넣을 수 있으며 Matcher#find() 메서드를 사용하여 패턴을 문자열로 사용할 수 있는지 여부를 확인할 수 있습니다.

당신은 이렇게 할 수 있습니다 : -

public boolean containsIllegals(String toExamine) {
    Pattern pattern = Pattern.compile("[~#@*+%{}<>\\[\\]|\"\\_^]");
    Matcher matcher = pattern.matcher(toExamine);
    return matcher.find();
}

주어진 패턴이 문자열에서 발견되면 find() 메서드는 true를 반환합니다.

아직 지적되지 않은 또 다른 방법은 String#split(regex) 입니다. 주어진 패턴에서 문자열을 분리하고 배열의 길이를 검사 할 수 있습니다. length가 1 이면 패턴이 문자열에 없습니다.

public boolean containsIllegals(String toExamine) {
    String[] arr = toExamine.split("[~#@*+%{}<>\\[\\]|\"\\_^]", 2);
    return arr.length > 1;
}

arr.length > 1 인 경우 문자열에 패턴의 문자 중 하나가 포함되어 있음을 의미합니다. 즉 분할 된 이유입니다. split 두 번째 매개 변수로 limit = 2 를 전달했습니다. 왜냐하면 우리는 단 하나의 split만으로도 ok입니다.


이 작업을 수행하는 매우 간단한 방법은 String.replaceAll 메서드를 사용하는 것입니다.

public boolean containsIllegal(final String toExamine) {
    return toExamine.length() != toExamine.replaceAll(
            "[~#@*+%{}<>\\[\\]|\"\\_^]", "").length();
}




string