web-dev-qa-db-ja.com

文字列内の最後のドットの出現に一致する正規表現

複数のドットを含むことができ、拡張子で終わるファイル名があります:

tro.lo.lo.lo.lo.lo.png

正規表現を使用して、最後に出現したドットを@2xのような別の文字列に置き換えてから、再びドット(Retina画像ファイル名に非常によく似ています)を置き換える必要があります:

tro.lo.png -> [email protected]

ここに私がこれまで持っているものがありますが、何にもマッチしません...

str = "http://example.com/image.png";
str.replace(/.([^.]*)$/, " @2x.");

助言がありますか?

53
alt

これには正規表現は必要ありません。 String.lastIndexOf します。

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);
}

実際の動作を参照.

更新:ただの楽しみのための正規表現ソリューション:

str = str.replace(/\.(?=[^.]*$)/, "@2x.");

リテラルドットに一致してからアサート((?=)positive lookahead )で、文字列の最後まで他の文字はドットではありません。置換には、削除する場合を除き、一致した1つのドットを含める必要があります。

97
Jon

特別な置換パターン$1置換文字列内:

console.log("tro.lo.lo.lo.lo.lo.png".replace(/\.([^.]+)$/, "@2x.$1"));
// "[email protected]"
27
Salman A

\.([^.]*?)を使用できます。

str.replace(/\.([^.]*?)$/, "@2x.$1");

$1サブグループを参照して、結果の文字列に部分をコピーする必要があります。

6
user193476

working demohttp://jsfiddle.net/AbDyh/1/

コード

var str = 'tro.lo.lo.lo.lo.lo.Zip',
    replacement = '@2x.';
str = str.replace(/.([^.]*)$/, replacement + '$1');

$('.test').html(str);

alert(str);
​
5
Tats_innit

文字列の先頭から最後の文字が出現するまで(およびその文字を含む)すべての文字を一致させるには、次を使用します。

^.*\.(?=[^.]*$)  To match the last occurrence of the "." character

^.*_(?=[^.]*$)   To match the last occurrence of the "_" character
3
JRS

_\._を使用して、ドットに一致させます。文字_._はany文字に一致します。

したがって、str.replace(/\.([^\.]*)$/, ' @2x.')

2
linepogl
'tro.lo.lo.lo.lo.lo.png'.replace(/([^\.]+).+(\.[^.]+)/, "$1.@x2$2")
1
한국인

文字列を単純に分割し、2番目から2番目のエントリに上記のサフィックスを追加しないのはなぜですか。

var arr = 'tro.lo.lo.lo.lo.lo.Zip'.split('.');
arr[arr.length-2] += '@2x';
var newString = arr.join('.');
1
J_A_X

あなたは単純にこのようにすることができます、

> "tro.lo.lo.lo.lo.lo.Zip".replace(/^(.*)\./, "$1@2x");
'tro.lo.lo.lo.lo.lo@2xzip'
1
Avinash Raj