Tengo un requisito en javascript para escribir una expresión regular para la siguiente condición
El campo Etiqueta maestra del registro de metadatos personalizados solo puede contener guiones bajos y caracteres alfanuméricos. Debe ser único, comenzar con una letra, no incluir espacios, no terminar con un guión bajo y no contener dos guiones bajos consecutivos.
Si omitimos la parte única, ya que tenemos que verificarla con los registros del sistema, necesito una expresión regular para probar las otras condiciones mencionadas anteriormente.
Aquí hay una expresión que he construido hasta ahora pero no parece funcionar. Soy nuevo en las expresiones regulares, por lo que agradecería cualquier ayuda.
/^[a-zA-Z]([a-zA-Z0-9][^ ][^__])[^_]*$/La cadena tiene todas las propiedades requeridas si y solo si coincide con la siguiente expresión regular:
/^[az][az\d]*(?:_[az\d]+)*$/iLa expresión regular se puede dividir de la siguiente manera.
/ ^ # match beginning of string [az] # match a letter [az\d]* # match one or more alphanumeric characters (?: # begin non-capture group _ # match an underscore [az\d]+ # match one or more alphanumeric characters )* # end non-capture group and execute it zero or more times $ # match end of string /i # specify matches of letters to be case-indifferentTenga en cuenta que la forma en que evito la presencia de dos guiones bajos seguidos tiene el efecto secundario fortuito de garantizar que el último carácter de la cadena no sea un guión bajo (¡un regalo de promoción!).
Usted podría estar buscando
^(?!_|\d)(?!.*__)(?!.*_$)\w+$Vea una demostración en regex101.com .
En JavaScript :
const regex = /^(?!_)(?!.*__)(?!.*_$)\w+$/gm; const str = `_ A abcd _ 123 some_spaces not_any_spaces__ 1test34 correct_thing`; let m; while ((m = regex.exec(str)) !== null) { // This is necessary to avoid infinite loops with zero-width matches if (m.index === regex.lastIndex) { regex.lastIndex++; } // The result can be accessed through the `m`-variable. m.forEach((match, groupIndex) => { console.log(`${match}`); }); }