64

I'm working with a Google API that returns IDs in the below format, which I've saved as a string. How can I write a Regular Expression in javascript to trim the string to only the characters after the last slash in the URL.

var id = 'http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9'
ac360
  • 7,735
  • 13
  • 52
  • 91

8 Answers8

108

Don't write a regex! This is trivial to do with string functions instead:

var final = id.substring(id.lastIndexOf('/') + 1);

It's even easier if you know that the final part will always be 16 characters:

var final = id.substring(id.length - 16);
lonesomeday
  • 233,373
  • 50
  • 316
  • 318
55

A slightly different regex approach:

var afterSlashChars = id.match(/\/([^\/]+)\/?$/)[1];

Breaking down this regex:

\/ match a slash
(  start of a captured group within the match
[^\/] match a non-slash character
+ match one of more of the non-slash characters
)  end of the captured group
\/? allow one optional / at the end of the string
$  match to the end of the string

The [1] then retrieves the first captured group within the match

Working snippet:

var id = 'http://www.google.com/m8/feeds/contacts/myemail%40gmail.com/base/nabb80191e23b7d9';

var afterSlashChars = id.match(/\/([^\/]+)\/?$/)[1];

// display result
document.write(afterSlashChars);
jfriend00
  • 683,504
  • 96
  • 985
  • 979
31

Just in case someone else comes across this thread and is looking for a simple JS solution:

id.split('/').pop(-1)

ramumb
  • 411
  • 4
  • 3
28

this is easy to understand (?!.*/).+

let me explain:

first, lets match everything that has a slash at the end, ok? that's the part we don't want

.*/ matches everything until the last slash

then, we make a "Negative lookahead" (?!) to say "I don't want this, discard it"

(?!.*) this is "Negative lookahead"

Now we can happily take whatever is next to what we don't want with this .+

YOU MAY NEED TO ESCAPE THE / SO IT BECOMES:

(?!.*\/).+

lalo
  • 901
  • 2
  • 10
  • 15
13

this regexp: [^\/]+$ - works like a champ:

var id = ".../base/nabb80191e23b7d9"

result = id.match(/[^\/]+$/)[0];

// results -> "nabb80191e23b7d9"
Kamil Kiełczewski
  • 85,173
  • 29
  • 368
  • 345
Andy
  • 1,190
  • 1
  • 11
  • 25
9

This should work:

last = id.match(/\/([^/]*)$/)[1];
//=> nabb80191e23b7d9
anubhava
  • 761,203
  • 64
  • 569
  • 643
  • 1
    Good answer. In Perl, regex delimeters must be escaped, even in character classes, otherwise it wouldn't find the regex to be parsed. –  Nov 04 '13 at 21:25
7

Don't know JS, using others examples (and a guess) -

id = id.match(/[^\/]*$/); // [0] optional ?

  • Just for the record, the match function returns an array.Using [0] is going to return just the first one. It's not optional. – brduca Sep 11 '14 at 17:07
  • There are no capture groups in this regex, isn't match overloaded to return the whole match if no index is referenced? –  Sep 30 '14 at 23:27
4

Why not use replace?

"http://google.com/aaa".replace(/(.*\/)*/,"")

yields "aaa"

Nimrod
  • 392
  • 2
  • 9