2009-03-04 22 views
26

tengo una cadena en un bucle y para cada bucle que está lleno de textos los ve así:Obtener el primer Int (s) en una cadena con javascript

"123 Hola a todos 4" "4567 cosas es divertido 67 " " 12368 más cosas "

Solo quiero recuperar los primeros números hasta el texto en la cadena y, por supuesto, no sé la longitud.

¡Gracias de antemano!

+0

Si sabes * * hay un número en la cadena, puede usar este delineador: "¡Hola, 123! 45 ".match (/ \ d + /). Shift();' De lo contrario, querrá probar 'null' antes de hacer' .shift() '. [Source] (https://stackoverflow.com/ a/609588/114558) – rinogo

Respuesta

39

Si el número se encuentra al principio de la cadena:

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

Si se trata de algún lugar de la cadena:

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

Y para una número entre caracteres:

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

[adición]

Una expresión regular para que coincida con todos los números en una cadena:

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

puede asignar la matriz resultante a una serie de números:

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

Incluyendo flotadores:

"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] 

Si existe la posibilidad de que la cadena no contiene ningún número, utilice:

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

Por lo tanto, para recuperar los números de inicio o final de la cadena 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

Estos no funcionan muy bien. ("hello123"). replace (/(^.+\D)(\d+)(\D.+$)/i,'$2 ') devuelve "hello124". De hecho, ninguno de estos funciona si el número está al final de la cadena. – user1311069

+1

@ user1311069: bueno, esa situación no estaba incluida en la respuesta. Sería constructivo si le proporcionó su solución. Siéntase libre;) – KooiInc

+1

@ user1311069: proporcionó algunos métodos adicionales, satisfaciendo sus necesidades también. – KooiInc

5

Si desea una int, solo parseInt(myString, 10). (El 10 significa la base 10, de lo contrario, JavaScript puede tratar de utilizar una base diferente, como 8 o 16.)

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

Si las cadenas comienza con el número (tal vez precedido por un espacio), simple parseInt(str, 10) es suficiente. parseInt omitirá los espacios en blanco iniciales.

10 es necesario, porque de lo contrario cadena como 08 se convertirá en 0 (parseInt en la mayoría de las implementaciones en cuenta los números que comienzan con 0 como octal).

+3

Dada la expresión regular '/ \ d + /' realmente no necesita 'parseInt', algo como' + match.shift() 'o' Number (match.shift()) 'es suficiente. Además, debe verificar si realmente hay una coincidencia. La cadena de entrada no puede contener ningún número: en ese caso, 'match' será' null'. – KooiInc

1

utilizar expresiones regulares:

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 
Cuestiones relacionadas