En una respuesta a una de mis preguntas, alguien había publicado:

// could replace it with an easier to work with delimiter
str.replace(/(;)(?![";"])/g, '|')

// or split it, but skip over results that are just a ;
var strArr = str.split(/(;)(?![";"])/);
for (s in strArr) {
    if (strArr[s] !== ";") {
        // do something with strArr[s]
        console.log(strArr[s]);
    }
}

Estoy completamente perdido en /(;)(?![";"])/. A mí me parece un montón de símbolos aleatorios :(.

¿Dónde puedo obtener más información sobre la sintaxis de expresiones regulares?

3
mowwwalker 21 jul. 2011 a las 12:43

4 respuestas

La mejor respuesta

Hay varios recursos:

Con respecto a la expresión real, los caracteres / marcan el principio y el final del literal de la expresión regular (como las comillas hacen para una cadena, aunque el final / puede ir seguido de banderas), y luego:

     +------------- 1
     |+------------ 2
     ||+----------- 3
     ||| +--------- 4
     ||| |
     ||| |
     ||| | +------- 5
     ||| | | +----- 6
     ||| | | | +--- 7
     ||| | | | |+-- 8
     |||/ \|/ \||
    /(;)(?![";"])/
  1. ( inicia un grupo de captura en este caso (porque ( no es seguido por ?, = o ! que cambian lo que hace)
  2. ; es un literal, coincide con un punto y coma
  3. ) finaliza el grupo de captura
  4. (?! Inicia un "lookahead negativo" para que la expresión general solo coincida si lo que está dentro de los paréntesis no se encuentra después del punto y coma
  5. [ comienza una clase de caracteres, que coincide con cualquiera de los caracteres que contiene
  6. ";" son los caracteres dentro de la clase de caracteres. (El segundo " es redundante). La clase de caracteres contiene ; y ".
  7. ] finaliza la clase de caracteres
  8. ) finaliza la búsqueda anticipada negativa iniciada en el n. ° 4

Entonces, en general, empareja (y captura) un punto y coma, siempre que no sea seguido inmediatamente por una comilla o punto y coma. No puedo ver ninguna razón en particular para capturar el punto y coma, pero tal vez haya una razón en el contexto de la pregunta donde se recomendó.

6
T.J. Crowder 21 jul. 2011 a las 08:59

Tengo una hoja de trucos de visibone a la que me refiero con frecuencia. Lo he encontrado realmente útil

2
James Wiseman 21 jul. 2011 a las 08:46

Eche un vistazo a http://www.regular-expressions.info/lookaround.html

El bit realmente confuso en esa expresión regular es la parte negativa anticipada que en javascript se representa usando la sintaxis (?! ... ). Una vez que entiendes eso, el resto es bastante trivial.

1
Mike Samuel 21 jul. 2011 a las 08:45

La mejor manera de aprender algo es haciendo. Aquí hay un simple probador que le permitirá ver qué hacen las expresiones: https://regex101.com/

0
mikeLundquist 9 feb. 2017 a las 23:32