Tách tất cả các ký tự không phải là số từ chuỗi trong JavaScript


701

Xem xét một kịch bản không phải DOM trong đó bạn muốn xóa tất cả các ký tự không phải là số khỏi chuỗi bằng JavaScript / ECMAScript. Bất kỳ nhân vật trong phạm vi 0 - 9nên được giữ.

var myString = 'abc123.8<blah>';

//desired output is 1238

Làm thế nào bạn sẽ đạt được điều này trong JavaScript đơn giản? Xin nhớ rằng đây là một kịch bản không phải DOM, vì vậy jQuery và các giải pháp khác liên quan đến các sự kiện trình duyệt và nhấn phím không phù hợp.

Câu trả lời:


1431

Sử dụng .replacephương thức của chuỗi với biểu thức \Dchính là lớp ký tự tốc ký khớp với tất cả các chữ số không:

myString = myString.replace(/\D/g,'');

5
Cảm ơn csj; bất cứ nơi nào để tìm thêm thông tin về \D?
p.campbell

34
Đây là tham chiếu regex mặc định của tôi: normal-expressions.info/reference.html Các lớp ký tự tích hợp mà mỗi lớp có bổ sung tích hợp. \ d \ D (chữ số so với mọi thứ trừ chữ số) \ w \ W (ký tự từ so với mọi thứ trừ ký tự từ) \ s \ S (khoảng trắng so với mọi thứ trừ khoảng trắng)
csj

3
Nói rõ hơn, đây là cú pháp để thay thế: w3schools.com/jsref/jsref_obj_regapi.asp vì dấu gạch chéo về phía trước và "g" là một phần của lệnh đó, không phải là một phần của RegEx.
Mike K

không replacehoạt động với cú pháp chính xác này trong tất cả các trình duyệt? có vẻ như tôi nhớ có được một object has no method 'replace' phiên bản IE cũ hơn khi sử dụng cái này với văn bản tôi đã lấy bằng jQuery ... hoặc một cái gì đó tương tự.
cwd

@cwd Tôi không biết những gì đã được hỗ trợ trong các trình duyệt trước đây hoặc hiện tại. Câu hỏi đã chỉ định bối cảnh không phải DOM, vì vậy có khả năng người đăng đang viết kịch bản trong môi trường trình duyệt web không.
csj

354

Nếu bạn cần cái này để lại dấu chấm cho số float, hãy sử dụng cái này

var s = "-12345.50 €".replace(/[^\d.-]/g, ''); // gives "-12345.50"

6
Bất kỳ chuyên gia regrec? Làm thế nào để làm điều này chỉ cho phép một dấu chấm duy nhất (rất phù hợp với số). Cảm ơn!
Kasperi

1
Ý anh là gì? đưa ra ví dụ đầu vào và đầu ra
max4ever

2
Không tốt: "aaa 2.9px of bbb.".replace(/[^\d.-]/g, '')2.9.Nên loại bỏ bất kỳ Chuỗi nào có thể bao quanh Số ..
vsync

2
@ max4ever bạn đã cứu mạng tôi, cảm ơn vì đã xử lý -trường hợp số (âm) :)
Pankaj Parkar

4
@Kasperi có lẽ:parseFloat("-1234.5.50 €".replace(/[^\d.-]/g, ''))
A. Genedy


23

Bạn có thể sử dụng RegExp để thay thế tất cả các ký tự không có chữ số:

var myString = 'abc123.8<blah>';
myString = myString.replace(/[^\d]/g, ''); // 1238

22

Một cái gì đó dọc theo dòng:

yourString = yourString.replace ( /[^0-9]/g, '' );

10
Không chính xác là một câu trả lời cho câu hỏi ban đầu, nhưng là một phiên bản để xử lý dấu thập phân:yourString = yourString.replace ( /[^0-9.]/g, '' );
Maxim Mai


0

Trong Angular / Ionic / VueJS - Tôi vừa nghĩ ra một phương pháp đơn giản:

stripNaN(txt: any) {
    return txt.toString().replace(/[^a-zA-Z0-9]/g, "");
}

Cách sử dụng trên khung nhìn:

<a [href]="'tel:'+stripNaN(single.meta['phone'])" [innerHTML]="stripNaN(single.meta['phone'])"></a>

0

Thật không may, không có câu trả lời nào ở trên làm việc cho tôi.

Tôi đang tìm cách chuyển đổi số tiền từ các chuỗi như $123,232,122.11(123232122.11) hoặc USD 123,122.892(123122.892) hoặc bất kỳ loại tiền nào như₹ 98,79,112.50 (9879112.5) để cung cấp cho tôi một đầu ra số bao gồm cả con trỏ thập phân.

Phải tạo ra regex của riêng tôi trông giống như thế này:

str = str.match(/\d|\./g).join('');

0

Hàm ngắn để xóa tất cả các ký tự không phải là số nhưng giữ nguyên số thập phân (và trả về số):

parseNum = str => +str.replace(/[^.\d]/g, '');
let str = 'a1b2c.d3e';
console.log(parseNum(str));


-5

chúng tôi đang ở trong năm 2017, bạn cũng có thể sử dụng ES2016

var a = 'abc123.8<blah>';
console.log([...a].filter( e => isFinite(e)).join(''));

hoặc là

console.log([...'abc123.8<blah>'].filter( e => isFinite(e)).join(''));  

Kết quả là

1238

12
Đây là một cách rất không hiệu quả để đi về hoạt động này.
djheru

Điều gì là không hiệu quả hoặc xấu ở đây?
Vladislav Kostenko

5
Nó chuyển đổi chuỗi thành một chuỗi các chuỗi ký tự đơn thông qua một phương thức dự phòng và sau đó áp dụng chức năng lọc qua JavaScript trên từng mục mảng, trả về một mảng chuỗi mới, để cuối cùng nối lại mảng đó thành một chuỗi. Regex lấy một chuỗi và trả về một chuỗi và việc xử lý được thực hiện thông qua mã gốc.
ShortFuse
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.