Reputation: 13947
I have a filename that can have multiple dots in it and could end with any extension:
tro.lo.lo.lo.lo.lo.png
I need to use a regex to replace the last occurrence of the dot with another string like @2x
and then the dot again (very much like a retina image filename) i.e.:
tro.lo.png -> [email protected]
Here's what I have so far but it won't match anything...
str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");
any suggestions?
Upvotes: 68
Views: 114137
Reputation: 34117
working demo http://jsfiddle.net/AbDyh/1/
code
var str = 'tro.lo.lo.lo.lo.lo.zip',
replacement = '@2x.';
str = str.replace(/.([^.]*)$/, replacement + '$1');
$('.test').html(str);
alert(str);
Upvotes: 5
Reputation: 272446
Just use special replacement pattern $1
in the replacement string:
console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "[email protected]"
Upvotes: 33
Reputation: 12847
Why not simply split the string and add said suffix to the second to last entry:
var arr = 'tro.lo.lo.lo.lo.lo.zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');
Upvotes: 1
Reputation: 174874
You could simply do like this,
> "tro.lo.lo.lo.lo.lo.zip".replace(/^(.*)\./, "$1@2x");
'tro.lo.lo.lo.lo.lo@2xzip'
Upvotes: 2
Reputation: 1458
To match all characters from the beginning of the string until (and including) the last occurence of a character use:
^.*\.(?=[^.]*$) To match the last occurrence of the "." character
^.*_(?=[^.]*$) To match the last occurrence of the "_" character
Upvotes: 3
Reputation: 437904
You do not need a regex for this. String.lastIndexOf
will do.
var str = 'tro.lo.lo.lo.lo.lo.zip';
var i = str.lastIndexOf('.');
if (i != -1) {
str = str.substr(0, i) + "@2x" + str.substr(i);
}
Update: A regex solution, just for the fun of it:
str = str.replace(/\.(?=[^.]*$)/, "@2x.");
Matches a literal dot and then asserts ((?=)
is positive lookahead) that no other character up to the end of the string is a dot. The replacement should include the one dot that was matched, unless you want to remove it.
Upvotes: 121
Reputation:
You can use the expression \.([^.]*?)
:
str.replace(/\.([^.]*?)$/, "@2x.$1");
You need to reference the $1
subgroup to copy the portion back into the resulting string.
Upvotes: 6
Reputation: 9355
Use \.
to match a dot. The character .
matches any character.
Therefore str.replace(/\.([^\.]*)$/, ' @2x.')
.
Upvotes: 2