jennifer lawrence
jennifer lawrence

Reputation: 535

most efficient way to check if a string contains specific characters

I have a string that should contain only specific characters: {}()[]

I've created a validate method that checks if the string contains forbidden characters (by forbidden characters I mean everything that is not {}()[] )

Here is my code:

private void validate(String string) {

    char [] charArray = string.toCharArray();
    for (Character c : charArray) {
        if (!"{}()[]".contains(c.toString())){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}

I'm wondering if there are better ways to do it since my approach doesn't seem right.

Upvotes: 4

Views: 4648

Answers (3)

Serhii Omelchuk
Serhii Omelchuk

Reputation: 41

I'd suggest using Stream if you are using Java 8. This allow you omit char to String boxing stuff.

private void validate_stream(String str) {
        if(str.chars().anyMatch(a -> a==125||a==123||a==93||a==91||a==41||a==40))
            throw new IllegalArgumentException("The string contains forbidden characters");
}

The numbers are ASCII codes for forbidden characters, you can replace them with chars if you want:

(a -> a=='{'||a=='}'||a=='['||a==']'||a=='('||a==')')

Upvotes: 2

I hope this works for you: I have added my code along with your code.

I have used a regex pattern, where \\ escapes brackets, which has special meaning in regex. And use matches method of string, it try to matches the given string value with given reg ex pattern. In this case as we used not(!), if we give string like "{}()[]as", it satisfies the if not condition and prints "not matched", otherwise if we give string like "{}()[]", else case will will print. You can change this how you like by throwing exception.

private static void validate(String string)
{

    String pattern = "\\{\\}\\(\\)\\[\\]";
    if(!string.matches(pattern)) {
        System.out.println("not matched:"+string);
    }
    else {
        System.out.println("data matched:"+string);
    }
    char [] charArray = string.toCharArray();
    for (Character c : charArray) {
        if (!"{}()[]".contains(c.toString())){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}

All the brackets are Meta characters, referenced here: http://tutorials.jenkov.com/java-regex/index.html

Upvotes: -1

Nexevis
Nexevis

Reputation: 4667

If I took the way you implement this, I would personally modify it like below:

private static void validate(String str) {
    for (char c : str.toCharArray()) {
        if ("{}()[]".indexOf(c) < 0){
            throw new IllegalArgumentException("The string contains forbidden characters");
        }
    }
}

The changes are as follows:

  • Not declaring a temporary variable for the char array.
  • Using indexOf to find a character instead of converting c to String to use .contains().

  • Looping on the primitive char since you no longer need toString().

  • Not naming the parameter string as this can cause confusion and is not good practice.

Note: contains calls indexOf(), so this does also technically save you a method call each iteration.

Upvotes: 4

Related Questions