2012-06-21 38 views
47

Tôi có một tên tập tin có thể có nhiều dấu chấm trong đó và có thể kết thúc với bất kỳ phần mở rộng:RegEx rằng sẽ phù hợp với sự xuất hiện cuối cùng của dấu chấm trong một chuỗi

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

tôi cần phải sử dụng một regex để thay thế cuối cùng xuất hiện của các dấu chấm với một chuỗi như @2x và sau đó chấm lại (rất giống với một hình ảnh filename võng mạc) ví dụ:

tro.lo.png -> [email protected] 

Dưới đây là những gì tôi có cho đến nay nhưng nó sẽ không phù hợp với bất cứ điều gì ...

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

bất kỳ đề xuất nào?

+0

Bạn cần một lookahead tiêu cực nếu bạn muốn làm điều đó với regex nhưng bạn thực sự không nên –

Trả lời

83

Bạn không cần regex cho việc này. String.lastIndexOf sẽ thực hiện.

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

See it in action.

Cập nhật: Một giải pháp regex, chỉ dành riêng cho những niềm vui của nó:

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

Trận một dấu chấm đen và sau đó khẳng định ((?=) được positive lookahead) mà không có nhân vật khác lên đến phần cuối của chuỗi là một dấu chấm. Việc thay thế phải bao gồm một dấu chấm đã được đối sánh, trừ khi bạn muốn xóa nó.

+0

Trả về một số nguyên của vị trí có ký tự đó, phải không? – alt

+0

Làm cách nào tôi có thể sử dụng số nguyên đó với .replace()? – alt

+0

@gdoron: Đã làm việc trên đó :) – Jon

1

Sử dụng \. để khớp với dấu chấm. Ký tự . khớp với bất kỳ ký tự nào.

Do đó str.replace(/\.([^\.]*)$/, ' @2x.').

+1

Hãy thử mã của bạn: '" tro.lo.lo.lo.lo.lo.zip ".replace (/ \. ([^\.] *) $ /, '@ 2x.') 'Nó không hoạt động. Lấy làm tiếc. – gdoron

+0

Tuyệt, không biết về regex – alt

+0

@Jon. Ha? . . . . – gdoron

5

Bạn có thể sử dụng biểu thức \.([^.]*?):

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

Bạn cần phải tham khảo các $1 phân nhóm để sao chép các phần trở lại vào chuỗi kết quả.

+0

Tôi nghĩ rằng điều này cần một khoảng thời gian khác vào cuối "$ 1 @ 2x" để làm việc, phải không? – alt

+0

Có một chút vội vã với câu trả lời đó - cố định nó để có ý nghĩa hơn w.r.t. regex ban đầu của bạn – rfw

+0

Tôi nghĩ rằng bạn đang thiếu một '.' trong chuỗi thay thế. Tôi thích thoát '.', nhưng lớp nhân vật có thể dễ đọc hơn. '.replace (/(.*)\./," $ 1 @ 2x. ")'. Dù sao, 1 cho một giải pháp đơn giản bằng cách sử dụng thuộc tính tham lam của '*' quantifier. – nhahtdh

4

bản demo làm việchttp://jsfiddle.net/AbDyh/1/

đang

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

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

alert(str); 
​ 
+1

Không hoàn toàn. đầu ra thiếu dấu chấm. – gdoron

+0

@gdoron đã nhận được: http://jsfiddle.net/AbDyh/1/ Cảm ơn bruvnic! –

+1

** Đầu ra phải là ** 'tro.lo.lo.lo.lo @ 2x.zip' ** Bạn xuất ** ** tro.lo.lo.lo.lo.lo @ 2xzip' – gdoron

23

Chỉ cần sử dụng special replacement pattern$1 trong chuỗi thay thế:

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

+1

Câu trả lời chính xác câu hỏi OPs. – Qtax

+1

@Qtax: Không hoàn toàn, bởi vì nó sẽ không hoạt động nếu dấu chấm cuối cùng cũng là ký tự cuối cùng. – Jon

+0

@Jon, đúng vậy. Gần như là sai rồi. ;) Nhưng '/\.([^.]*)$/' làm điều đó, không cần phải tìm cách giải quyết. – Qtax

2

Để phù hợp với tất cả các nhân vật từ đầu của chuỗi cho đến khi (và bao gồm) sự xuất hiện cuối cùng của việc sử dụng nhân vật:

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

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

Tại sao không chỉ cần tách chuỗi và thêm hậu tố cho biết từ cuối đến mục nhập cuối cùng:

var arr = 'tro.lo.lo.lo.lo.lo.zip'.split('.'); 
arr[arr.length-2] += '@2x'; 
var newString = arr.join('.'); 
Các vấn đề liên quan