tags:

views:

2809

answers:

7

I'm new at regular expressions and wonder how to phrase one that collects everything after the last /.

I'm extracting an ID used by googles gdata.

my example string is http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123

Where the ID is p1f3JYcCu_cb0i0JYuCu123

Oh and I'm using PHP.

+12  A: 

Generally:

/([^/]*)$

The data you want would then be the match of the first group.


Edit   Since you’re using PHP, you could also use strrchr that’s returning everything from the last occurence of a character in a string up to the end. Or you could use a combination of strrpos and substr, first find the position of the last occurence and then get the substring from that position up to the end. Or explode and array_pop, split the string at the / and get just the last part.

Gumbo
somehow that doesnt look like working one ?
rasjani
you may need to escape the slash in the character class, depending on the language you're using. `/([^\/]*$/`
rampion
@rasjani: It depends on the language if you can use that regular expression like I wrote it. Some languages have a syntax literal for regular expressions (like Perl’s `/…/`), others have classes to build one from a string (like Java) and others just use strings (like PHP). But in general my regular expression is correct.
Gumbo
This would also match "/", which means your group would be empty, i.e. an empty ID. If you don't want that consider /([^/]+)$ instead.
Jonathon Watney
Thanks Gumbo, that help me a lot too. There heaps of different ways to do things in php.
Hellonearthis
+1  A: 

This pattern will not capture the last slash in $0, and it won't match anything if there's no characters after the last slash.

/(?<=\/)([^\/]+)$/

Edit: but it requires lookbehind, not supported by ECMAScript (Javascript, Actionscript), Ruby or a few other flavors. If you are using one of those flavors, you can use:

/\/([^\/]+)$/

But it will capture the last slash in $0.

eyelidlessness
ruby19 has lookbehind support
rampion
+1  A: 
/^.*\/(.*)$/

^ = start of the row

.*\/ = greedy match to last occurance to / from start of the row

(.*) = group of everything that comes after the last occurance of /

rasjani
+9  A: 

This matches at least one of (anything not a slash) followed by end of the string:

[^/]+$


Notes:

  • No parens because it doesn't need any groups - result goes into group 0 (the match itself).
  • Uses + (instead of *) so that if the last character is a slash it fails to match (rather than matching empty string).


But, most likely a faster and simpler solution is to use your language's built-in string list processing functionality - i.e. ListLast( Text , '/' ) or equivalent function.

For PHP, the closest function is strrchr which works like this:

strrchr( Text , '/' )

That will include the / in the result though.

Peter Boughton
+1 for using non-regex solution. Sub-stringing the URL would faster and would avoid importing regex support.
Jonathon Watney
Indeed - I suspect most functions for this would work backwards from the end, and so avoid checking most characters. Afaik all regex engines work forwards, so would have to check every character.
Peter Boughton
Thanks for the awesome help, I know have a much better understanding of regex. The PHP code looks like this.preg_match('([^/]+$)', "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu124", $matches)
Hellonearthis
Breaks if there is no slash.
Mk12
+1  A: 

Not a PHP programmer, but strrpos seems a more promising place to start. Find the rightmost '/', and everything past that is what you are looking for. No regex used.

Find position of last occurrence of a char in a string

hughdbrown
I was thinking of doing that, but new preg_match could do it.I'm sure there's better ways to do things, than the ways I end up doing them.
Hellonearthis
+3  A: 

You can also get the "filename", or the last part, with the basename function.

<?php
$url = 'http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123';

echo basename($url); // "p1f3JYcCu_cb0i0JYuCu123"

On my box I could just pass the full URL. It's possible you might need to strip off http:/ from the front.

Basename and dirname are great for moving through anything that looks like a unix filepath.

James Socol
That's a nice alternative again, thanks.
Hellonearthis
A: 

you can also normal string split

$str = "http://spreadsheets.google.com/feeds/spreadsheets/p1f3JYcCu_cb0i0JYuCu123";
$s = explode("/",$str);
print end($s);
ghostdog74
Thanks, that's an awesome too.
Hellonearthis