Necesito dividir una cadena. Tengo una expresión regular capaz de hacer coincidir cada subcadena por completo.
Intenté usarlo con String.prototype.matchAll() y puede dividirse, pero esa función también acepta "tokens no válidos": partes de la cadena que no coinciden con mi expresión regular. Por ejemplo:
var re = /\s*(\w+|"[^"]*")\s*/g // matches a word or a quoted string var str = 'hey ??? "a"b' // the '???' part is not a valid token var match = str.matchAll(re) for(var m of match){ console.log("Matched:", m[1]) } Me da el token hey , "a" y b . De hecho, esas son las subcadenas que coinciden con mi expresión regular, pero me hubiera gustado obtener un error en este caso, ya que la cadena contiene ??? que no es una subcadena válida.
¿Cómo puedo hacer esto?
La expresión regular /\s*(\w+|"[^"]*")\s*/g se usa para extraer múltiples coincidencias de patrones de una cadena, no está destinada a validar una cadena.
Si necesita devolver true o false , necesita una expresión regular para la validación que tenga las siguientes propiedades:
g (si se usa con RegExp#test , puede causar efectos secundarios no deseados y agrega confusión (consulte ¿Por qué un RegExp con indicador global da resultados incorrectos? )).Entonces, en su caso, use el enfoque de dos pasos:
/^\s*(?:(?:\w+|"[^"]*")\s*)*$/.test(text) primero y luegoconst matches = text.match(/\w+|"[^"]*"/g) .Vea la demostración de JavaScript:
var extraction_re = /\w+|"[^"]*"/g; var validation_re = /^\s*(?:(?:\w+|"[^"]*")\s*)*$/; for (var text of ['hey "a"b', 'hey ??? "a"b']) { if (validation_re.test(text)) { console.log("Matched:", text.match(extraction_re)) } else { console.log(text, "=> No Match!") } }