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);
}));