Srinivas B
Srinivas B

Reputation: 1852

how to write the regular expression patterns for the following scenarios

Can any body give me some regular expression patterns which will extract the version numbers(1.5) from some sample strings like

    "jdk1.5","jdk-v1.5","jdk-V1.5","jdk V1.5","jdkv1.5","jdk version1.5","1.5.6","v1.5","V1.5","version 1.5","Version 1.5","14.5.4","1.5.4","14.5.4""jdj14.5"

I want to store the regex patterns in a string array and will check these patterns with the above strings. If there is a match with any of the stored patterns, then the output should be the version number 1.5. I want to extract the version numbers (1.5) only from the above strings.

valid string formats : "jdk1.5","jdk-v1.5","jdk-V1.5","jdk V1.3","jdkv1.4","jdk version1.5","1.5.6","v1.5","V1.5","version 1.5","Version 1.5","14.5.4","1.5.4","14.5.4""jdj14.5","14.52.3.42"

Invalid String formats : "jdk1..2","jdk.1.2.",".1.2."

Upvotes: 0

Views: 2318

Answers (7)

kushalappa
kushalappa

Reputation: 1

Use the regex:

(^([jJ][dD][kK])([\s]*[vV]*\d+.\d+(.\d+)*))$

This would make your day :)

Upvotes: 0

Shashwat
Shashwat

Reputation: 2668

(?<![\d.])(\d+[.])+(\d+)(?![\d.])

Check this...

It will match the string of the form

number.number.number.number

not followed or preceded by a dot

Upvotes: 1

mmdemirbas
mmdemirbas

Reputation: 9158

Requirements

If you can formulize what you want as:

  1. Anything in format 1.5 or 1.5.6 or 1.5.6.7 or 1.5.6.7.8 etc. is valid version number by default (numbers can be one or more digits like 12.60.70).
  2. A version number 1.5 can be followed by a dot (.) only if it is in the format 1.5.6.
  3. A version number 1.5 never preceded by a dot (.) like .1.5.

Solution

Then, I can suggest you this regex:

(?!\.)(\d+(\.\d+)+)(?![\d\.])

See it in action, includes all positive samples and excludes all negative samples you provided.

How to use

First capture group will be your version number. Sample code:

Pattern pattern    = Pattern.compile("(?!\\.)(\\d+(\\.\\d+)+)(?![\\d\\.])");
Matcher matcher    = pattern.matcher(inputStr);
boolean matchFound = matcher.find();

if (matchFound)
{
    String version = matcher.group(1);
    System.out.println("Version number: " + version);
}
else
{
    System.out.println("No match for the input!");
}

Note: This will work only with Java 7+, because look-aheads doesn't supported by older versions.

Upvotes: 1

Hugo Alves
Hugo Alves

Reputation: 188

For Strings like 1.5.6 you can just use: [0-9](.[0-9])+ http://regexr.com?31ubo

Upvotes: 0

hsz
hsz

Reputation: 152284

Try with:

^(jdk[- ]?)?([vV](ersion)? ?)?\d\.\d(\.\d)?$

You can ommit [vV] with v if you set CASE_INSENSITIVE flag.

Upvotes: 2

DhruvPathak
DhruvPathak

Reputation: 43265

Try this regular expression:

(?<=([\w\s]))(\d)\.(\d)(.\d)?

This will match all your valid formats , and not match any invalid format.

See it working here : http://regexr.com?31ubc

I would be grateful if someone can assist me in making it better, and also on how to make it match 1.5.6

Upvotes: 1

Hugo Alves
Hugo Alves

Reputation: 188

If you want to catch more than two numbers like "1.5.6" or "1.5.0" you can use

[0-9](.[0-9])+

Or if you only want the first two digits [0-9].[0-9] , but this will not work on strings like 1.5.0.0, it will catch 1.5 and 0.0.

Upvotes: -1

Related Questions