Search code examples
javaregexregex-lookaroundsregex-groupregex-greedy

RegEx for matching mp3 URLs


How can I get an mp3 url with REGEX?

This mp3 url, for example:

https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3

This is a what I've tried so far but I want it to only accept a url with '.mp3' on the end.

(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]

Solution

  • This expression would likely pass your desired inputs:

    ^(https?|ftp|file):\/\/(www.)?(.*?)\.(mp3)$
    

    If you wish to add more boundaries to it, you can do that. For instance, you can add a list of chars instead of .*.

    enter image description here

    I have added several capturing groups, just to be simple to call, if necessary.

    RegEx

    If this wasn't your desired expression, you can modify/change your expressions in regex101.com.

    RegEx Circuit

    You can also visualize your expressions in jex.im:

    enter image description here

    const regex = /^(https?|ftp|file):\/\/(www.)?(.*?)\.(mp3)$/gm;
    const str = `https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3
    http://soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3
    http://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3
    ftp://soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3
    file://localhost/examples/mp3/SoundHelix-Song-1.mp3
    file://localhost/examples/mp3/SoundHelix-Song-1.wav
    file://localhost/examples/mp3/SoundHelix-Song-1.avi
    file://localhost/examples/mp3/SoundHelix-Song-1.m4a`;
    let m;
    
    while ((m = regex.exec(str)) !== null) {
        // This is necessary to avoid infinite loops with zero-width matches
        if (m.index === regex.lastIndex) {
            regex.lastIndex++;
        }
        
        // The result can be accessed through the `m`-variable.
        m.forEach((match, groupIndex) => {
            console.log(`Found match, group ${groupIndex}: ${match}`);
        });
    }

    Java Test

    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    final String regex = "^(https?|ftp|file):\\/\\/(www.)?(.*?)\\.(mp3)$";
    final String string = "https://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3\n"
         + "http://soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3\n"
         + "http://www.soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3\n"
         + "ftp://soundhelix.com/examples/mp3/SoundHelix-Song-1.mp3\n"
         + "file://localhost/examples/mp3/SoundHelix-Song-1.mp3\n"
         + "file://localhost/examples/mp3/SoundHelix-Song-1.wav\n"
         + "file://localhost/examples/mp3/SoundHelix-Song-1.avi\n"
         + "file://localhost/examples/mp3/SoundHelix-Song-1.m4a";
    
    final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
    final Matcher matcher = pattern.matcher(string);
    
    while (matcher.find()) {
        System.out.println("Full match: " + matcher.group(0));
        for (int i = 1; i <= matcher.groupCount(); i++) {
            System.out.println("Group " + i + ": " + matcher.group(i));
        }
    }