2012-06-15 17 views
8

Si tengo la cadena:conseguir y reemplazar el último número en una cadena con JavaScript o jQuery

var myStr = "foo_0_bar_0";

y supongo que deberíamos tener una función llamada getAndIncrementLastNumber(str)

por lo que si hago esto :

myStr = getAndIncrementLastNumber(str); // "foo_0_bar_1"

Tomando en consideraciones que no podría ser otro i texto en lugar de foo y bar y es posible que no haya underscores o que haya más de un underscore;

¿Hay alguna manera con JavaScript o jQuery con .replace() y algunos RegEx?

+3

¿Qué pasa si el último número es' 9'? ¿Puede su LastNumber contener más de 1 dígito? –

+0

Sí, ese último número podría contener más de 1 dígito. –

Respuesta

15

Puede usar la expresión regular /[0-9]+(?!.*[0-9])/ para buscar el último número de una cadena (fuente: http://frightanic.wordpress.com/2007/06/08/regex-match-last-occurrence/). Esta función, que el uso de expresiones regulares con el partido(), parseInt() y reemplazar(), debe hacer lo que necesita:

function increment_last(v) { 
    return v.replace(/[0-9]+(?!.*[0-9])/, parseInt(v.match(/[0-9]+(?!.*[0-9])/), 10)+1); 
} 

Probablemente no muy eficiente, pero para cadenas cortas, no debería importar.

EDIT: Aquí está una manera un poco mejor, usando una llamada de retorno en lugar de buscar la cadena dos veces:

function increment_last(v) { 
    return v.replace(/[0-9]+(?!.*[0-9])/, function(match) { 
     return parseInt(match, 10)+1; 
    }); 
} 
+0

Es bueno que funcione incluso si el último número no está al final de la cadena. –

+0

Por cierto, en el primer ejemplo, el parámetro '10' está fuera de los paréntesis' parseInt() '. Todavía funciona bien, ya que la raíz por defecto es 10 y el parámetro extra '10' añadido a 'replace()' se ignora. –

+0

Éste funciona perfectamente en lo que estoy trabajando en este momento. –

0

en expresiones regulares intente esto:

function getAndIncrementLastNumber(str){ 
    var myRe = /\d+[0-9]{0}$/g; 
    var myArray = myRe.exec(str); 
    return parseInt(myArray[0])+1;​ 
} 

demo: http://jsfiddle.net/F9ssP/1/

+0

Funciona al obtener e incrementar, simplemente falla la parte 'replace'. compruebe la respuesta de @ Brilliand. –

6

Así es como lo hago:

function getAndIncrementLastNumber(str) { 
    return str.replace(/\d+$/, function(s) { 
     return ++s; 
    }); 
} 

Fiddle

O también este, gracias especiales a Eric:

function getAndIncrementLastNumber(str) { 
    return str.replace(/\d+$/, function(s) { 
     return +s+1; 
    }); 
} 

Fiddle

+0

's + 1' tendría más sentido aquí que' s ++ ' – Eric

+0

@Eric El ++ s era forzar el encasillado en lugar de usar' parseInt', bueno, edité la respuesta ahora. =] –

+0

Probablemente debería especificar la base para parseInt, como indicó Matthew Schinckel en una edición de mi respuesta. – Brilliand

1

probar esta demo favorhttp://jsfiddle.net/STrR6/1/ohttp://jsfiddle.net/Mnsy3/

código

existingId = 'foo_0_bar_0'; 
newIdOnly = existingId.replace(/foo_0_bar_(\d+)/g, "$1"); 
alert(newIdOnly); 

getAndIncrementLastNumber(existingId); 

function getAndIncrementLastNumber(existingId){ 
    alert(existingId); 
newId = existingId.replace(/(\d+)/g, function(match, number) { 
    return parseInt(number) + 1; 
}); 
alert(newId); 
} 
​ 

o

existingId = 'foo_0_bar_0'; 
newIdOnly = existingId.replace(/foo_0_bar_(\d+)/g, "$1"); 
alert(newIdOnly); 

getAndIncrementLastNumber(existingId); 

function getAndIncrementLastNumber(existingId){ 
    alert(existingId); 
    newId = existingId.replace(/\d+$/g, function(number) { 
    return parseInt(number) + 1; 
}); 
alert("New ID ==> " + newId); 
} 
​ 
+0

La primera demostración no se ejecuta y la segunda actualiza ambos números dentro de la cadena. teniendo 'foo_1_bar_1' cuando debería ser' foo_0_bar_1', verifique la respuesta de @ Brilliand. –

+0

@Mr_Nizzle Gracias significaba ser esto - http://jsfiddle.net/Mnsy3/10/ esto debería funcionar :), la segunda pelea es algo extra si necesitas 2 enteros para ser incrementado, gracias –

+0

Ahora que uno funciona pero solo si hay 'foo' y' bar. –

0

¿Los números de ser separados con algunos personajes? Lo que entendí de tu pregunta es que tu cadena puede verse así 78_asd_0_798_fgssdflh__0_2323 !! Si este es el caso, primero necesita quitar todos los caracteres y guiones bajos de una sola vez. Y luego, lo que sea que hayas eliminado puede reemplazarlo con una coma o algo.

Así que básicamente tendrá str1: 78_asd_0_798_fgssdflh__0_2323; str2: 78,0,0,798,2323.

str2 no necesita ser una cadena, puede simplemente guardarlos en una matriz variable y obtener el número máximo e incrementarlo.

Mi siguiente pregunta es ¿eso basta con su problema? Si tiene que reemplazar el número más grande con este número incrementado, entonces debe reemplazar la ocurrencia de este número en str1 y reemplazarlo con su resultado.

Espero que esto ayude. Para reemplazar usando jquery, probablemente pueda mirar en JQuery removing '-' character from string es solo un ejemplo, pero tendrá una idea.

0

Si desea sólo para obtener el último número de la secuencia, aquí es una buena manera de usar parseInt()

if(Stringname.substr(-3)==parseInt(Stringname.substr(-3))) 
var b=Stringname.substr(-3); 
else if(Stringname.substr(-2)==parseInt(Stringname.substr(-2))) 
var b=Stringname.substr(-2); 
else 
var b=Stringname.substr(-1); 

Comprueba y dar la respuesta correcta y la almacena en la variable B durante 1 número de dos dígitos y hasta un número de 3 dígitos. Se puede hacer a cualquier si tienes la lógica

0

@Brilliant es correcto, 1, sólo quería dar una versión de su respuesta con 2 modificaciones:

  • Retire el operador negative look-ahead innecesaria.
  • Agregue la capacidad de agregar un número al final, en caso de que no exista.

`` `

/** 
* Increments the last integer number in the string. Optionally adds a number to it 
* @param {string} str The string 
* @param {boolean} addIfNoNumber Whether or not it should add a number in case the provided string has no number at the end 
*/ 
function incrementLast(str, addIfNoNumber) { 
    if (str === null || str === undefined) throw Error('Argument \'str\' should be null or undefined'); 
    const regex = /[0-9]+$/; 
    if (str.match(regex)) { 
     return str.replace(regex, (match) => { 
      return parseInt(match, 10) + 1; 
     }); 
    } 
    return addIfNoNumber ? str + 1 : str; 
} 

pruebas:

describe('incrementLast',() => { 
     it('When 0',() => { 
      assert.equal(incrementLast('something0'), 'something1'); 
     }); 
     it('When number with one digit',() => { 
      assert.equal(incrementLast('something9'), 'something10'); 
     }); 
     it('When big number',() => { 
      assert.equal(incrementLast('something9999'), 'something10000'); 
     }); 
     it('When number in the number',() => { 
      assert.equal(incrementLast('1some2thing9999'), '1some2thing10000'); 
     }); 
     it('When no number',() => { 
      assert.equal(incrementLast('1some2thing'), '1some2thing'); 
     }); 
     it('When no number padding addIfNoNumber',() => { 
      assert.equal(incrementLast('1some2thing', true), '1some2thing1'); 
     }); 
    }); 
Cuestiones relacionadas