2011-10-18 53 views
10

Tôi có một regex JavaScript để so khớp các số trong một chuỗi, mà tôi nhân và thay thế.Javascript regex và parseInt

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, parseInt('$1', 10) * 2); 

tôi muốn nó trở 'foo2 bar5.4' nhưng nó sẽ trả về 'fooNaN barNaN'

Tôi đang làm gì sai ở đây?

Trả lời

16

parseInt('$1', 10) * 2 được thực thi trước và kết quả của nó được chuyển đến replace. Bạn muốn sử dụng một hàm callback:

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function(match, number) { 
    return +number * 2; 
}); 

Hơn nữa, parseInt sẽ làm tròn xuống bất kỳ giá trị dấu chấm động, vì vậy kết quả sẽ là "foo2 bar4". Thay vào đó, bạn có thể sử dụng toán tử cộng đơn đơn nhất cộng để chuyển đổi bất kỳ chuỗi số thành một số.

+0

Huh .. '+ number'? Tại sao bạn sử dụng '+ number', hãy giải thích nó, cảm ơn bạn rất nhiều. – LiuwkCn

+1

Nó phải được giải thích bằng câu cuối cùng: * "Thay vào đó bạn có thể sử dụng toán tử cộng đơn để chuyển đổi bất kỳ chuỗi số thành một số." * –

+0

OK, cảm ơn! nhận xét với short.exe, hah. :) – LiuwkCn

1

Bạn đang chuyển kết quả của parseInt('$1', 10) * 2 tới hàm replace, chứ không phải là chính câu lệnh.

Thay vào đó, bạn có thể qua một chức năng để replace như vậy:

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function (str) { 
    return parseInt(str, 10) * 2; 
}); 

Mọi chi tiết, đọc MDC article trên đi qua các chức năng như một tham số để String.replace

0

Lưu ý rằng nếu bạn có nhiều so với một nhóm, bạn có thể thực hiện một số việc như:

"p-622-5350".replace(/p-(\d+)-(\d+)/, function (match, g1, g2) { 
    return "p-" + (+g1 * 10) + "-" + (+g2 *10); 
}); 

(lưu ý các thông số bổ sung trong hàm)