Pankaj
Pankaj

Reputation: 5250

Java Regex needed

I need regex that will fail only for below patterns and pass for everything else.

  1. RXXXXXXXXXX (X are digits)

  2. XXX.XXX.XXX.XXX (IP address)

I have basic knowledge of regex but not sure how to achieve this one.

For the first part, I know how to use regex to not start with R but how to make sure it allows any number of digits except 10 is not sure.

^[^R][0-9]{10}$ - it will do the !R thing but not sure how to pull off the not 10 digits part.

Upvotes: 0

Views: 69

Answers (3)

Kevin Marsh
Kevin Marsh

Reputation: 48

This should work:

!(string.matches("R\d{10}|(\d{3}\\.){3}\d{3}");

The \d means any digit, the brackets mean how many times it is repeated, and the \. means the period character. Parentheses indicate a grouping.

Here's a good reference on java regex with examples. http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

Upvotes: 0

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476659

Well, simply define a regex:

Pattern p = Pattern.compile("R[0-9]{10} ((0|1|)[0-9]{1,2}|2([0-4][0-9]|5[0-5]))(\\.((0|1|)[0-9]{1,2}|2([0-4][0-9]|5[0-5]))){3}");
Matcher m = p.matcher(theStringToMatch);
if(!m.matches()) {
    //do something, the test didn't pass thus ok
}

Or a jdoodle.


EDIT:

Since you actually wanted two possible patterns to filter out, chance the pattern to:

Pattern p = Pattern.compile("(R[0-9]{10})|(((0|1|)[0-9]{1,2}|2([0-4][0-9]|5[0-5]))(\\.((0|1|)[0-9]{1,2}|2([0-4][0-9]|5[0-5]))){3})");

If you want to match the entire string (so that the string should start and end with the pattern, place ^ in from and $ at the end of the pattern.

Upvotes: 2

Luiggi Mendoza
Luiggi Mendoza

Reputation: 85779

Regex is not meant to validate every kind of input. You could, but sometimes it is not the right approach (similar to use a wrench as a hammer: it could do it but is not meant for it).

Split the string in two parts, by the space, then validate each:

String foo = "R1234567890 255.255.255.255";
String[] stringParts = foo.split(" ");
Pattern p = Pattern.compile("^[^R][0-9]{10}$");
Matcher m = p.macher(stringParts[0]);
if (m.matches()) {
    //the first part is valid
    //start validating the IP
    String[] ipParts = stringParts.split("\\.");
    for (String ip : ipParts) {
        int ipPartValue = Integer.parseInt(ip);
        if (!(ipPartValue >= 0 && ipPartValue <= 255)) {
            //error...
        }
    }
}

Upvotes: -1

Related Questions