Abi
Abi

Reputation: 1345

regular expression for file name

I have files in the format *C:\Temp\myfile_124.txt*

I need a regular expression which will give me just the number "124" that is whatever is there after the underscore and before the extension.

I tried a number of ways, latest is

(.+[0-9]{18,})(_[0-9]+)?\\.txt$

I am not getting the desired output. Can someone tell me what is wrong?

       Matcher matcher = FILE_NAME_PATTERN.matcher(filename);
        if (matcher.matches() && matcher.groupCount() == 2) {
            try {
                String index = matcher.group(2);
                if (index != null) {
                    return Integer.parseInt(index.substring(1));
                }
            }
            catch (NumberFormatException e) {

            }   

Upvotes: 0

Views: 220

Answers (5)

Peter Lawrey
Peter Lawrey

Reputation: 533442

The first part [0-9]{18,} states you have atleast 18 digits which you don't have.

Usually with regex its a good idea to make the expression as simple as possible. I suggest trying

_([0-9]+)?\\.txt$

Note: you have to call find() to make it perform the lookup, otherwise it says "No match found"


This example

String s = "C:\\Temp\\myfile_124.txt";
Pattern p = Pattern.compile("_(\\d+)\\.txt$");
Matcher matcher = p.matcher(s);
if (matcher.find())
    for (int i = 0; i <= matcher.groupCount(); i++)
        System.out.println(i + ": " + matcher.group(i));

prints

0: _124.txt
1: 124

Upvotes: 2

nyxz
nyxz

Reputation: 7418

.*_([0-9]+)\.txt

This should work too. Of course you should double escape for Java.

Upvotes: 0

ddarellis
ddarellis

Reputation: 3960

You can do this

^.*_\([^\.]*\)\..*$

Upvotes: 0

sp00m
sp00m

Reputation: 48807

.*_([1-9]+)\.[a-zA-Z0-9]+

The group 1 will contain the desired output.

Demo

Upvotes: 0

davidrac
davidrac

Reputation: 10738

This may work for you: (?:.*_)(\d+)\.txt The result is in the match group. This one uses positive lookahead and will only match the number: \d+(?=\.txt)

Upvotes: 0

Related Questions