Câu trả lời:
Biểu thức chính quy:
var numberPattern = /\d+/g;
'something102asdfkj1948948'.match( numberPattern )
Điều này sẽ trả về một Mảng có hai phần tử bên trong, '102' và '1936148'. Hoạt động như bạn muốn. Nếu nó không khớp, nó sẽ trả về null.
Để nối chúng:
'something102asdfkj1948948'.match( numberPattern ).join('')
Giả sử bạn không xử lý các số thập phân phức tạp, điều này sẽ đủ cho tôi.
d
, vì vậy.match(/\d+/g)
parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Bạn cũng có thể loại bỏ tất cả các ký tự không có chữ số ( \D
hoặc [^0-9]
):
let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');
console.log(word_Without_Numbers)
Đối với số có phân số thập phân và dấu trừ, tôi sử dụng đoạn mã này:
var NUMERIC_REGEXP = /[-]{0,1}[\d]*[.]{0,1}[\d]+/g;
'2.2px 3.1px 4px -7.6px obj.key'.match(NUMERIC_REGEXP)
// return ["2.2", "3.1", "4", "-7.6"]
Cập nhật: - 7/9/2018
Đã tìm thấy một công cụ cho phép bạn chỉnh sửa biểu thức chính quy một cách trực quan: Trình phân tích cú pháp & Trình hiển thị biểu thức chính quy JavaScript .
Cập nhật:
Đây là một cái khác mà bạn thậm chí có thể gỡ lỗi regrecer: Trình kiểm tra và gỡ lỗi regex trực tuyến .
Cập nhật:
Một số khác: RegExr .
Cập nhật:
Nếu bạn chỉ muốn chữ số:
var value = '675-805-714';
var numberPattern = /\d+/g;
value = value.match( numberPattern ).join([]);
alert(value);
//Show: 675805714
Bây giờ bạn có được các chữ số tham gia
Tôi đoán bạn muốn lấy số từ chuỗi. Trong trường hợp này, bạn có thể sử dụng như sau:
// Returns an array of numbers located in the string
function get_numbers(input) {
return input.match(/[0-9]+/g);
}
var first_test = get_numbers('something102');
var second_test = get_numbers('something102or12');
var third_test = get_numbers('no numbers here!');
alert(first_test); // [102]
alert(second_test); // [102,12]
alert(third_test); // null
get_numbers/1
trả về một chuỗi các chuỗi, không phải số. Ví dụ của bạn, nó sẽ trả về: * ["102"]
* ["102", "12"]
* null
Các câu trả lời đưa ra không thực sự khớp với câu hỏi của bạn, trong đó ngụ ý một số kéo dài . Ngoài ra, hãy nhớ rằng bạn đang nhận được một chuỗi trở lại; nếu bạn thực sự cần một số, bỏ kết quả:
item=item.replace('^.*\D(\d*)$', '$1');
if (!/^\d+$/.test(item)) throw 'parse error: number not found';
item=Number(item);
Nếu bạn đang xử lý các id mục số trên một trang web, mã của bạn cũng có thể chấp nhận một cách hữu ích Element
, trích xuất số từ id
(hoặc cha mẹ đầu tiên của nó với một id
); nếu bạn có Event
ích, bạn cũng có thể nhận được Element
từ đó.
IMO câu trả lời số 3 tại thời điểm này của Chen Dachao là cách phù hợp nếu bạn muốn nắm bắt bất kỳ loại số nào, nhưng biểu thức thông thường có thể được rút ngắn từ:
/[-]{0,1}[\d]*[\.]{0,1}[\d]+/g
đến:
/-?\d*\.?\d+/g
Ví dụ: mã này:
"lin-grad.ient(217deg,rgba(255, 0, 0, -0.8), rgba(-255,0,0,0) 70.71%)".match(/-?\d*\.?\d+/g)
tạo mảng này:
["217","255","0","0","-0.8","-255","0","0","0","70.71"]
Tôi đã xử lý một ví dụ độ dốc tuyến tính MDN để nó kiểm tra đầy đủ biểu thức chính quy và không cần phải cuộn ở đây. Tôi nghĩ rằng tôi đã bao gồm tất cả các khả năng về số âm, số thập phân, hậu tố đơn vị như deg và%, sử dụng dấu phẩy và dấu cách không nhất quán, và các ký tự dấu chấm / dấu chấm / dấu gạch ngang trong văn bản "lin-grad.ient ". Xin vui lòng cho tôi biết nếu tôi thiếu một cái gì đó. Điều duy nhất tôi có thể thấy rằng nó không xử lý là một số thập phân được hình thành xấu như "0..8".
Nếu bạn thực sự muốn một mảng số, bạn có thể chuyển đổi toàn bộ mảng trong cùng một dòng mã:
array = whatever.match(/-?\d*\.?\d+/g).map(Number);
Mã cụ thể của tôi, đang phân tích cú pháp các hàm CSS, không cần phải lo lắng về việc sử dụng ký tự dấu chấm / dấu chấm không phải là số, vì vậy biểu thức thông thường có thể còn đơn giản hơn:
/-?[\d\.]+/g
Sử dụng split và regex:
var str = "fooBar0123".split(/(\d+)/);
console.log(str[0]); // fooBar
console.log(str[1]); // 0123
Theo câu trả lời của @ Syntle, nếu bạn chỉ có các ký tự không phải là số, bạn sẽ nhận được một Uncaught TypeError: Cannot read property 'join' of null
.
Điều này sẽ ngăn lỗi nếu không tìm thấy kết quả khớp và trả về một chuỗi trống:
('something'.match( /\d+/g )||[]).join('')
Nếu bạn cũng muốn các số được phân tách bằng dấu chấm / dấu phẩy, thì:
\d*\.?\d*
hoặc là
[0-9]*\.?[0-9]*
Bạn có thể sử dụng https://regex101.com/ để kiểm tra biểu thức chính của mình.
Mọi thứ mà các giải pháp khác đều có, nhưng với một chút xác nhận
// value = '675-805-714'
const validateNumberInput = (value) => {
let numberPattern = /\d+/g
let numbers = value.match(numberPattern)
if (numbers === null) {
return 0
}
return parseInt(numbers.join([]))
}
// 675805714