Búsqueda de sitios web

cadena - expresión regular para coincidir solo con caracteres alfanuméricos, guion, guion bajo y punto, sin puntuación repetida


Soy nuevo en regex y TypeScript, y estoy tratando de conseguir un regex que coincida con:

1. must start with alphanumeric (repeating is fine)
2. can contain alphanumeric (repeating is fine)
3. can contain periods, underscores, and/or hyphens (no repeating)
4. must end with alphanumeric (repeating is fine)

He estado buscando y encontré muchos ejemplos que eran algo similares, e intenté ajustarlos para que funcionaran como necesito, sin embargo no he podido llegar a la solución correcta. Si alguien tiene una buena expresión regular que pueda ayudar y alguna explicación del porqué, para poder aprender más sobre el sistema, eso sería increíble.

Aquí hay algunos ejemplos de lo que estoy tratando de validar como cadenas aceptables:

this.is.Valid
also_a_valid_1
Me-too.im_an-ugly.but_vALid-5tring

y algunos ejemplos de cadenas inválidas que mi expresión regular actual está permitiendo, pero que deberían fallar porque tienen puntos/guiones/bajos repetidos, y tienen punto, guion o guion bajo al inicio y al final:

-this..should..not.be.valid....
..THIS__.-also-should..fail-
why..IS_regex--so.confusing-for-n0obs

y aquí hay un ejemplo del regex que estoy usando:

 validateString(myString: string): boolean {
    return (/^[a-zA-Z0-9_\-\.]+((\.-?|-\.?)[a-zA-Z0-9_\-\.]+)*$/.test(varKey))
 }

Respuesta #1

Usar :

^[a-z0-9]+(?:[._-][a-z0-9]+)*$

Explicación:

^                   # beginning of line
  [a-z0-9]+         # 1 or more alphanum
  (?:               # start non capture group
    [._-]           # period, underscore or hyphen
    [a-z0-9]+       # 1 or more alphanum
  )*                # end group, may appear 0 or more times
$

Demostración

var test = [
    'this.is.Valid',
    'also_a_valid_1',
    'Me-too.im_an-ugly.but_vALid-5tring',
    '-this..should..not.be.valid....',
    '..THIS__.-also-should..fail-',
    'why..IS_regex--so.confusing-for-n0obs',
    'h',
    'sTrInG',
];
console.log(test.map(function (a) {
  return a+' :'+/^[a-z0-9]+(?:[._-][a-z0-9]+)*$/i.test(a);
}));

Artículos relacionados