Intentando hacer coincidir las URL en el formato de cadena arbitraria + guión + 8 dígitos:

yellow-purse-65788544
big-yellow-purse-66784500
iphone-smart-case-water-resistant-55006610

He construido este, pero no funciona:

new RegExp(/^[a-z][A-Z]-\d{8}$/).test('big-yellow-purse-66784500'); // false

¿Puedes ayudarme a arreglar mi RegExp rota?

-1
ChrisRich 13 may. 2016 a las 02:14

4 respuestas

La mejor respuesta

La cadena no es completamente arbitraria. Sería minúscula con guiones alfanuméricos.

Puede usar la siguiente expresión regular, que descarta una lista de falsos positivos que otras respuestas no tienen en cuenta (detallado en la expresión regularx101):

^(?:[a-z0-9]+-)+\d{8}$

Regex101

Ejemplo de construcción:

document.body.textContent = /^(?:[a-z0-9]+-)+\d{8}$/.test('big-yellow-purse-66784500');
0
timolawl 13 may. 2016 a las 00:10

Prueba esto:

/^([a-zA-Z]*-)+\d{8}$/.test("iphone-smart-case-water-resistant-55006610");
0
Ad.Infinitum 12 may. 2016 a las 23:23

Su cadena tiene varios guiones ( - ) pero la expresión regular solo tiene el último , intente esto:

/^[a-z-]+-\d{8}$/im

Regex101 Demo

https://regex101.com/r/rT7xT0/1


Explicación de expresiones regulares:

/^[a-z-]+-\d{8}$/im

    ^ assert position at start of a line
    [a-z-]+ match a single character present in the list below
        Quantifier: + Between one and unlimited times, as many times as possible, giving back as needed [greedy]
        a-z a single character in the range between a and z (case insensitive)
        - the literal character -
    - matches the character - literally
    \d{8} match a digit [0-9]
        Quantifier: {8} Exactly 8 times
    $ assert position at end of a line
    i modifier: insensitive. Case insensitive match (ignores case of [a-zA-Z])
    m modifier: multi-line. Causes ^ and $ to match the begin/end of each line (not only begin/end of string)

Demostración:

stringOne = "iphone-smart-case-water-resistant-55006610";
stringtwo = "big-yellow-purse-66784500";
stringThree = "iphone-smart-case-water-resistant-55006610222222";
var myregexp = /^[a-z-]+-\d{8}$/im;

if(myregexp.test(stringOne)){
  document.write(stringOne + " - TRUE<br>"); 
}else{
  document.write(stringOne + " - FALSE<br>"); 
}

if(myregexp.test(stringtwo)){
  document.write(stringtwo + " - TRUE<br>"); 
}else{
  document.write(stringtwo + " - FALSE<br>"); 
}

if(myregexp.test(stringThree)){
  document.write(stringThree + " - TRUE<br>"); 
}else{
  document.write(stringThree + " - FALSE<br>"); 
}
0
Pedro Lobito 12 may. 2016 a las 23:48

Si la cadena realmente puede ser arbitraria, puede usar esto:

/^.*?-\d{8}$/i

.+? es una coincidencia no codiciosa para cualquier personaje, y \d{8} dice que coincida exactamente con 8 dígitos.

Alternativamente, podría usar:

/^[\w-]+?-\d{8}$/i

Esto coincide con cualquier número de caracteres de "palabra" o '-', seguidos de un '-' y 8 dígitos.

Ambos también coinciden con el caso comúnmente visto con URL legibles por humanos en los que hay varios caracteres '-' en secuencia, lo que puede suceder al convertir algo como "Clip de dólar $ ign money" a "clip de dólar - ign-money".

0
Michael Gaskill 13 may. 2016 a las 01:11