¿Cómo se manejan las escapas de regex no válidas manejadas? -- javascript campo con regex campo con google-chrome campo con firefox campo con ecmascript-6 camp Relacionados El problema

How are invalid regex escapes handled?


3
vote

problema

Español

Recientemente he creado una implementación de C ++ 11 STD :: Rogex, que pasa muchas pruebas de conformidad. Dado que la sintaxis y la semántica de C ++ 11 STD :: REGEX se derivan de ECMASCRIP 5.1, pensé que ejecutaría esas mismas pruebas contra un navegador, para verificar cuán estrechamente coincide con el comportamiento.

Descubrí un par de discrepancias extrañas en el manejo de secuencias de escape inválidas.

  /* As expected, matching the standard: */ /,/.exec(",") -> [","]  /* Err... this should throw, it doesn't match any ECMAScript production:    IdentityEscape := SourceCharacter but not IdentifierPart (ES 5.1)                      SourceCharacter but not UnicodeIDContinue (ES 6.0) */ /z/.exec("z") -> ["z"] (Chrome & Firefox!)  /* It even works for characters that have a defined meaning: */ /u/.exec("u") -> ["u"] (Chrome)                   null (Firefox)  /* Errr...! This is creepiest, it matches a backslash!!! */ /c/.exec("\c") -> ["c"] (Chrome & Firefox!)   

¿Son estos problemas de conformidad conocidos en Chrome y Firefox, o están conformando a algún comportamiento previo / futuro de ECMASCRIP?

Original en ingles

I've recently created an implementation of C++11 std::regex, which passes many conformance tests. Since the C++11 std::regex syntax and semantics are derived from ECMAScript 5.1, I thought I'd run those same tests against a browser, to check how closely the behaviour matches.

I discovered a couple of odd discrepancies in handling of invalid escape sequences.

/* As expected, matching the standard: */ /\,/.exec(",") -> [","]  /* Err... this should throw, it doesn't match any ECMAScript production:    IdentityEscape := SourceCharacter but not IdentifierPart (ES 5.1)                      SourceCharacter but not UnicodeIDContinue (ES 6.0) */ /\z/.exec("z") -> ["z"] (Chrome & Firefox!)  /* It even works for characters that have a defined meaning: */ /\u/.exec("u") -> ["u"] (Chrome)                   null (Firefox)  /* Errr...! This is creepiest, it matches a backslash!!! */ /\c/.exec("\\c") -> ["\c"] (Chrome & Firefox!) 

Are these known conformance issues in Chrome and Firefox, or are they conforming to some previous/future ECMAScript behaviour?

              

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

Hay un problema con las especificaciones tituladas Ecmascript IdentyEscape es ambiguo . La discusión indica que los navegadores están usando esta regla para solucionar el problema:

  try {     db.Entity.Add(entity);     db.SaveChanges(); } catch (DbEntityValidationException dbEx) {     foreach (var validationErrors in dbEx.EntityValidationErrors)     {         foreach (var validationError in validationErrors.ValidationErrors)         {             System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);         }     } } 111  

De hecho, puedo confirmar msdn enumera la solución.

Tenga en cuenta que la especificación dice:

  try {     db.Entity.Add(entity);     db.SaveChanges(); } catch (DbEntityValidationException dbEx) {     foreach (var validationErrors in dbEx.EntityValidationErrors)     {         foreach (var validationError in validationErrors.ValidationErrors)         {             System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);         }     } } 2  

Entonces, la línea, significa que try { db.Entity.Add(entity); db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } 3 , try { db.Entity.Add(entity); db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } 4 , y try { db.Entity.Add(entity); db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } 5 puede coincidir allí. Pero no try { db.Entity.Add(entity); db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } 6 .

try { db.Entity.Add(entity); db.SaveChanges(); } catch (DbEntityValidationException dbEx) { foreach (var validationErrors in dbEx.EntityValidationErrors) { foreach (var validationError in validationErrors.ValidationErrors) { System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage); } } } 7 , por supuesto, solo coincidirá si no puede coincidir aquí:

  try {     db.Entity.Add(entity);     db.SaveChanges(); } catch (DbEntityValidationException dbEx) {     foreach (var validationErrors in dbEx.EntityValidationErrors)     {         foreach (var validationError in validationErrors.ValidationErrors)         {             System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);         }     } } 8  

específicamente:

  try {     db.Entity.Add(entity);     db.SaveChanges(); } catch (DbEntityValidationException dbEx) {     foreach (var validationErrors in dbEx.EntityValidationErrors)     {         foreach (var validationError in validationErrors.ValidationErrors)         {             System.Console.WriteLine("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);         }     } } 9  

¿Pero por qué context.AddOrUpdate(entity)0 ? Probablemente, debido a que es especial (y podrían haber olvidado que se cubrieron debajo de context.AddOrUpdate(entity)1 ). Según regex101.com:

context.AddOrUpdate(entity)2 coincide con los caracteres ASCII típicamente asociados con el control + A a través del control + Z: x01 a x1a.

REGEX101.com también explica cómo context.AddOrUpdate(entity)3 está analizado:

context.AddOrUpdate(entity)4 coincide con los caracteres context.AddOrUpdate(entity)5 Literalmente (distingue entre mayúsculas y minúsculas)

(Sospecho que Firefox puede tratar context.AddOrUpdate(entity)6 de manera similar.)


... a menos que esté usando el modificador cell.textLabel.text = [[self.allTask objectAtIndex:indexPath.row] titleText] ; cell.textLabel.text = [[self.allTask objectAtIndex:indexPath.row] descriptionText]; cell.textLabel.text = [[self.allTask objectAtIndex:indexPath.row] dateText]; 27 . En ese caso, olvídate de todo porque context.AddOrUpdate(entity)8 y context.AddOrUpdate(entity)9 son errores.

En PCRE, (donde context.SaveChanges()0 y context.SaveChanges()1 tienen los mismos significados,) Estos regulares son errores con y sin el modificador 998877766632 . Este comportamiento es "correcto", al menos en mi mente.


Línea inferior: las escapadas innecesarias están mal definidas y deben ser errores .
Evítelos.

 

There is an issue with the specs titled ECMAScript IdentityEscape is ambiguous. The discussion there indicates that browsers are using this rule to fix the issue:

IdentityEscape ::  SourceCharacter but not c 

Indeed, I can confirm MSDN lists the fix.

Keep in mind that the spec states:

SourceCharacter ::  any Unicode code unit 

So the line there means that \,, \z, and \u can match there. But not \c.

\u, of course, will only match if it can't match here:

CharacterEscape ::   ControlEscape   c ControlLetter   HexEscapeSequence   UnicodeEscapeSequence   OctalEscapeSequence   IdentityEscape 

Specifically:

UnicodeEscapeSequence ::  u HexDigit HexDigit HexDigit HexDigit 

But why c? Probably because it is special (and they might have forgotten they were covered under c ControlLetter). According to Regex101.com:

\cY Matches ASCII characters typically associated with Control+A through Control+Z: \x01 through \x1A.

Regex101.com also explains how \c is parsed:

\c matches the characters \c literally (case sensitive)

(I suspect that Firefox may treat \u similarly.)


...Unless you're using the u modifier. In that case, forget everything because \u and \c alone are errors.

In PCRE, (where \u and \c have the same meanings,) these regexes are errors with and without the u modifier. This behavior is "correct", at least in my mind.


Bottom line: Unnecessary escapes are poorly defined and should be errors.
AVOID THEM.

 
 
 
 

Relacionados problema

2  Encontrar índice en matriz bidimensional  ( Find index in two dimensional array ) 
Si tengo una matriz que contiene objetos, donde cada objeto tiene una propiedad de identificación, puedo encontrar un índice usando: function getSelectedL...

0  WEBPACK2 'No se puede resolver activos / img / coin.png' en 'Proyecto'  ( Webpack2 cant resolve assets img coin png in project ) 
Estoy tratando de importar una imagen dinámicamente con una declaración requerida, pero incluso antes de eso, las importaciones regulares como así no funciona...

0  Obj.entries no formateo correctamente  ( Obj entries not formatting correctly ) 
Tengo un archivo JSON que está estructurado así: 0: '{make: "John Deere", model: "4010", year: "1958", uid: "-KzPj2RoB0CatW_vpfwq"}' 1:'{make: "John Deere ...

3  Cómo puedo poder asignar un objeto grande a una matriz en ES6 [duplicado]  ( How i can can map an large object to an array in es6 ) 
Esta pregunta ya tiene respuestas aquí : conversión de un objeto JS a una matriz usando jQuery ...

0  La palabra clave Javascript const utiliza de manera diferente [duplicado]  ( Javascript const keyword used differently ) 
Esta pregunta ya tiene respuestas aquí : Notación del soporte de objeto JavaScript ({navegación} =) ...

0  Cambio de nombre de las teclas de objeto desestructurando con un símbolo o un número  ( Renaming object keys destructuring with a symbol or a number ) 
Me estaba preguntando si hay una manera de cambiar el nombre de los valores clave de objetos con un símbolo o un número como el nuevo nombre. Sé que puedes ca...

0  Forzar la sincronización antes de entrar en una función  ( Forcing sync before going into a function ) 
Estoy tratando de asignar una matriz de cadenas que contiene IMG URL Pero de revisar los registros en la forma en que descubrí que Cuando la matriz 'imágene...

3  ¿Por qué las cadenas Iterables en ES2015?  ( Why are strings iterables in es2015 ) 
¿Puede alguien, por favor, ayúdame a comprender mejor la decisión de diseño de hacer que las cadenas de JavaScript sean inerables en ES2015? La mayoría de los...

1  Obtener el error "C3" no se define no-nodef  ( Getting error c3 is not defined no undef ) 
Estoy tratando de escribir una directiva de gráficos de barras personalizada en JS angular usando ES6. He instalado la biblioteca C3 usando Bower Instale C3 -...

6  ¿Puedo usar ES6 JavaScript en NOde.js sin Babel?  ( Can i use es6 javascript in node js without babel ) 
Me estaba preguntando, si es posible usar ES6 en el nodo 10.15 ahora en 2019, ¡porque pensé, ES6 ahora sería una característica de JavaScript compatible e imp...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos