Regex sử dụng javascript để trả về chỉ số


129

Nếu tôi có một chuỗi như "Something12" hoặc "Something102", làm thế nào tôi có thể sử dụng regex trong javascript để chỉ trả về các phần số?

Câu trả lời:


226

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.


3
lỗi ghét phải kén chọn, nhưng điều này trả về một mảng, không phải là một đối tượng (ít nhất là bằng chrome).
Maus

14
Tất cả các mảng là đối tượng mặc dù, không?
meder omuraliev

6
@MuhammadUmer - bạn đã thử chưa?
meder omuraliev

2
@Onza bạn đang thiếu dấu gạch chéo ngược trước d, vì vậy.match(/\d+/g)
meder ometiciev

10
@MuhammadUmer, @meder: Hai bạn nên kết hợp lực lượng: parseInt('987d98sf79s7f9s8f9sf'.match(/\d+/gi).join(''))
Joisey Mike

199

Bạn cũng có thể loại bỏ tất cả các ký tự không có chữ số ( \Dhoặc [^0-9]):

let word_With_Numbers = 'abc123c def4567hij89'
let word_Without_Numbers = word_With_Numbers.replace(/\D/g, '');

console.log(word_Without_Numbers)


Chà, ngoại trừ việc OP muốn "chỉ là phần số" chứ không phải chuỗi.
Scott Fraley

24

Đố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:

Regexper Regex Pal .


Giải pháp hoàn hảo, duy nhất hoạt động với số thập phân và số âm
ArmaGeddON

17

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


9

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

1
Chỉ cần làm cho nó rõ ràng, get_numbers/1trả 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
Sơn Trần-Nguyễn

2

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 Elementtừ đó.


Mặc dù đây là một câu trả lời tiện lợi nhưng tôi không nghĩ rằng các câu trả lời khác "không thực sự khớp với [câu hỏi]". Trong thực tế, các câu trả lời khác là linh hoạt hơn. Họ sẽ làm việc với các số kéo dài cũng như các số ở giữa. Có một chút tự phụ khi cho rằng OP muốn nó CHỈ hoạt động với các số kéo dài.
Xandor


2

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

2

Sử dụng split và regex:

    var str = "fooBar0123".split(/(\d+)/);
    console.log(str[0]); // fooBar
    console.log(str[1]); // 0123

1

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('')


0

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.


0

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
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.