Digamos,
let sentence= "Dear user {#val#}{#val#} thanks"{#val#} es el valor dinámico en la oración anterior. Aquí, en lugar de {#val#}, puede haber cualquier valor, pero puede haber al menos 0 y un máximo de 5 caracteres. Así que estoy sustituyendo el {#val#} como .{0,5} . No necesito considerar espacios excepto la parte {#val#}, por lo que mi expresión regular formada sería,
let regex = /^Dear\s*user\s*.{0,5}.{0,5} thanks$/i let customermsg = "Dear user 1 2 thanks" //Should be valid let customermsg1 = "Dear user 12345 6789 thanks" //Should be valid let customermsg2 = "Dear user 123 5 6789 thanks" //Should be valid because space can also be considered as a character and for fist .{0,5} => 123 5 and for second .{0,5} => 6789 let customermsg3 = "Dear user 1 thanks" //Should pass let customermsg4 = "Dea r user 1 tha nks" // Should Pass since spaces are not considered in the static portion.pero cuando trato de probar usando a continuación,
regex.test(customermsg)Es todo lo contrario. Incluso he probado lo siguiente,
let splitters=/{\\#val\\#}|((\\s\*))/gi; sentence = sentence.replace(splitters, (x, y) => y ? y : ".(\\S{0,5})");Esto devuelve la expresión regular como,
/^Dear\s*user\s*.(\S{0,5}).(\S{0,5})\s*thanks$/Pero esto tampoco está funcionando como se esperaba. Estoy atascado en esto. Por favor, ayúdame.
Lo que necesita es verificar si un número y espacios en blanco están presentes varias veces de acuerdo con
"Estimado usuario 1, gracias" // Debería fallar ya que solo hay un valor
Por lo tanto, su expresión regular está bien, excepto que no verifica si un número y espacios en blanco están presentes más de una vez.
Utilice la siguiente expresión regular
Dear\s*user\s*([\d]+[\s]+){2,5}\s*thanks$ ([\d]+[\s]+){2,5}\s*
La parte ([\d]+[\s]+){2,5}\s* asegura que un número esté presente al menos dos veces, por lo que un solo número en la cadena Dear user ... thanks fallará.
Puede usar tantos espacios en blanco antes, entre y después de los dígitos como desee.
let regex = /Dear\s*user\s*([\d]+[\s]+){2,5}\s*thanks$/i let customermsg = "Dear user 1 2 thanks" //Should be valid let customermsg1 = "Dear user 12345 6789 thanks" //Should be valid let customermsg2 = "Dear user 123 5 6789 thanks" //Should be valid because space can also be considered as a character and for fist .{1,5} => 123 5 and for second .{1,5} => 6789 let customermsg3 = "Dear user 1 thanks" //Should fail since only one value is there let customermsg4 = "Dear user 435 4523 thanks" // With many spaces console.log(regex.test(customermsg)); console.log(regex.test(customermsg1)); console.log(regex.test(customermsg2)); console.log(regex.test(customermsg3)); console.log(regex.test(customermsg4));https://regex101.com/r/qBFSxq/1
Esta puede ser una forma de resolverlo: ^Dear\s*user(\s*\d)?(?(1)(.{1,5})(?=(\s{1,}))(?<!(\s{2}))(.{1,5}) thanks|\s*thanks)$
Editar: se agregó la construcción de búsqueda anticipada positiva de expresiones regulares ( (.{1,5})(?=(\s{1,})) ), https://www.regular-expressions.info/lookaround.html , además de usar condicionales dentro de expresiones regulares ( (\s*\d)?(?(1)... ) y mirada negativa detrás ( (?<!(\s{2}))(.{1,5}) )
Puede usar el grupo de captura s para la parte anterior a la coincidencia y comenzar la coincidencia con un único carácter que no sea un espacio en blanco.
Afirme 1-9 caracteres a la derecha seguido de thanks . Si ese es el caso, haga coincidir al menos otro carácter que no sea un espacio en blanco seguido del resto hasta llegar a thanks .
Por ejemplo
let regex = /^(Dear\s*user\s*)\S(?=.{1,9} thanks$)\s*\S.*(?= thanks$)/i; [ "Dear user 1 2 thanks", "Dear user 12345 6789 thanks", "Dear user 123 5 6789 thanks", "Dear user 1 thanks", "Dear user 1 thanks" ].forEach(s => console.log(s.replace(regex, (m, g1) => g1 + "{#val#}{#val#}")) );O si puede haber solo dígitos y espacios con un solo grupo de captura
let regex = /^(Dear\s*user\s*)\d(?=[ \d]*\d)[ \d]{1,9}(?= thanks$)/i; [ "Dear user 1 2 thanks", "Dear user 12345 6789 thanks", "Dear user 123 5 6789 thanks", "Dear user 1 thanks", "Dear user 1 thanks", "Dear user 12345 64789 thanks" ].forEach(s => console.log(s.replace(regex, (m, g1) => g1 + "{#val#}{#val#}")) );Según tengo entendido, quieres
Y también
El primer punto es el más complicado porque debe asegurarse de que el primer valor no comience con un espacio, mientras que el segundo valor puede seguir siendo la misma expresión regular. Esencialmente, tiene dos requisitos diferentes aquí.
La única solución que se me ocurre es hacer una búsqueda anticipada para asegurarme de que el siguiente carácter después de los espacios opcionales después del usuario sea un carácter que no sea un espacio.
/^Dear\s*user\s*(?=\S)(.{1,5}.{1,5}) thanks$/No estoy seguro de haber entendido completamente sus requisitos, pero si desea permitir espacios en blanco entre cualquiera de las letras, puede hacer algo como esto:
^\s*D\s*e\s*a\s*r\s*u\s*s\s*e\s*r\s*(?:.\s*){0,5}\s*(?:.\s*){0,5}\s*t\s*h\s*a\s*n\s*k\s*s\s*$
Explicación: \s* se coloca antes y después de cada letra para permitir espacios en blanco. Para los rangos de caracteres, (?:.\s*){0,5} se usa para permitir espacios en blanco después de cada carácter contado. (El ?: al principio lo excluye como grupo de captura).
Demostración: https://regex101.com/r/2ZAqui/1