2009-03-04 38 views
26

Tôi có một chuỗi trong một vòng lặp và cho mỗi vòng lặp nó được lấp đầy với các văn bản ngoại hình như thế này:Lấy Int đầu tiên (s) trong một chuỗi với javascript

"123 xin chào tất cả mọi người 4" "4567 thứ vui vẻ 67 " " 12368 nội dung khác "

Tôi chỉ muốn truy xuất số đầu tiên đến văn bản trong chuỗi và mã nguồn của tôi không biết độ dài.

Cảm ơn trước!

+0

Nếu bạn * biết * có một số trong chuỗi, bạn có thể sử dụng một lớp lót này: '" Xin chào 123 ở đó! "Nếu không, bạn sẽ muốn kiểm tra' null' trước khi thực hiện '.shift()'. [Source] (https://stackoverflow.com/ a/609588/114558) – rinogo

Trả lời

39

Nếu số là lúc bắt đầu của chuỗi:

("123 hello everybody 4").replace(/(^\d+)(.+$)/i,'$1'); //=> '123' 

Nếu đó là nơi nào đó trong chuỗi:

(" hello 123 everybody 4").replace(/(^.+)(\w\d+\w)(.+$)/i,'$2'); //=> '123' 

Và đối với một số giữa các ký tự:

("hello123everybody 4").replace(/(^.+\D)(\d+)(\D.+$)/i,'$2'); //=> '123' 

[phụ lục]

Một biểu thức chính quy để phù hợp với tất cả các số trong một chuỗi:

"4567 stuff is fun4you 67".match(/^\d+|\d+\b|\d+(?=\w)/g); //=> ["4567", "4", "67"] 

Bạn có thể lập bản đồ các mảng dẫn đến một loạt các số:

"4567 stuff is fun4you 67" 
    .match(/^\d+|\d+\b|\d+(?=\w)/g) 
    .map(function (v) {return +v;}); //=> [4567, 4, 67] 

Bao gồm phao:

"4567 stuff is fun4you 2.12 67" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) 
    .map(function (v) {return +v;}); //=> [4567, 4, 2.12, 67] 

Nếu khả năng tồn tại mà chuỗi không chứa bất kỳ số lượng, sử dụng:

("stuff is fun" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []) 
    .map(function (v) {return +v;}); //=> [] 

Vì vậy, để lấy lại sự khởi đầu hoặc kết thúc số của chuỗi 4567 stuff is fun4you 2.12 67"

// start number 
var startingNumber = ("4567 stuff is fun4you 2.12 67" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []) 
    .map(function (v) {return +v;}).shift(); //=> 4567 

// end number 
var endingNumber = ("4567 stuff is fun4you 2.12 67" 
    .match(/\d+\.\d+|\d+\b|\d+(?=\w)/g) || []) 
    .map(function (v) {return +v;}).pop(); //=> 67 
+0

Những công việc này không tốt lắm. ("hello123") .thay thế (/(^.+\D) (\d+) (\D.+$)/i,'$2 ') trả về "hello124". Trong thực tế, không ai trong số này làm việc nếu số ở cuối chuỗi. – user1311069

+1

@ user1311069: tốt, tình huống đó không được đưa vào câu trả lời. Nó sẽ mang tính xây dựng nếu bạn cung cấp giải pháp cho nó. Cảm thấy tự do;) – KooiInc

+1

@ user1311069: cung cấp thêm một số phương pháp, đáp ứng nhu cầu của bạn. – KooiInc

5

Nếu bạn muốn có một int, chỉ cần parseInt(myString, 10). (Các 10 nghĩa căn cứ 10, nếu không, JavaScript có thể thử sử dụng một cơ sở khác nhau như 8 hoặc 16.)

39
var str = "some text and 856 numbers 2"; 
var match = str.match(/\d+/); 
document.writeln(parseInt(match[0], 10)); 

Nếu chuỗi bắt đầu với số lượng (có thể trước bởi khoảng trắng), đơn giản parseInt(str, 10) là đủ. parseInt sẽ bỏ qua khoảng trắng hàng đầu.

10 là cần thiết, bởi vì nếu không chuỗi như 08 sẽ được chuyển đổi sang 0 (parseInt trong hầu hết các trường xem xét số bắt đầu với 0 như bát phân).

+3

Với cụm từ thông dụng '/ \ d + /' bạn không thực sự cần 'parseInt', giống như' + match.shift() 'hoặc' Number (match).shift()) 'là đủ. Hơn nữa, bạn cần phải kiểm tra xem có thực sự là một trận đấu hay không. Chuỗi đầu vào có thể không chứa số nào cả: trong trường hợp đó 'match' sẽ là' null'. – KooiInc

1

Sử dụng Regular Expressions:

var re = new RegExp(/^\d+/); //starts with digit, one or more 
var m = re.exec("4567 stuff is fun 67"); 
alert(m[0]); //4567 

m = re.exec("stuff is fun 67"); 
alert(m); // null 
Các vấn đề liên quan