2010-11-03 17 views
12

En una entrevista reciente me pidieron para descifrar esta expresión regular¿Qué significa esta expresión regular?

^\^[^^] 

¿Me podría ayudar con él. También proporcione algunos enlaces donde puedo aprender expresiones regulares para entrevistas.

+2

Sería mucho más claro si publicaras la expresión regular real, no la cadena de Java con sus dolorosas ya veces engañosas bbaacckkssllllaasshheesses. – tchrist

+1

@tchrist - ¿por qué? él dijo que ** esta ** secuencia de caracteres le fue dada en una entrevista, una entrevista relacionada con Java, supongo, mirando la etiqueta. (Por cierto, la etiqueta de expresión regular fue agregada por otra persona, originalmente solo estaba etiquetada como Java) –

+1

@Andreas_D, odio admitir cuántas veces he estropeado una expresión regular de Java debido al problema de la barra diagonal inversa. Ahora los leo desde un archivo de utilería o como un argumento de línea de comando para (intentar) evitar el problema. Aun así, hay una gran diferencia entre un literal de Java utilizado como expresión regular y una expresión regular real. Es como pelear con el caparazón, pero peor. – tchrist

Respuesta

30

Coincide con cadenas que comienzan con ^ seguido por cualquier carácter que no sea ^.

Por lo que se correspondería con:

^foo 
^b 

pero no

foo 
^^b 

Explicación:

Caret (^) es un personaje meta de expresiones regulares con dos significados diferentes:

Fuera de la clase de caracteres (primer uso en su expresión regular) funciona como iniciar ancla.

Dentro de la clase de caracteres que actúa como negador si utilizado como el primer carácter de la clase de caracteres (tercero el uso en su expresión regular).

Precede a una expresión regular con \ escapa (lo hace no especial). El segundo uso de ^ en su expresión regular se escapó y coincide con un literal ^ en la cadena.

Dentro de una clase de caracteres de un ^ que es no la primera carácter de la clase de caracteres se trata literalmente. Entonces, el 4to uso en su expresión regular es un literal ^.

Algunos ejemplos más para que quede claro:

  • ^a                  : Partidos cadena que comienza con a
  • ^ab              : cadena coincide comienzo con a seguido por b
  • [a]              : Encaja en una cadena que tiene un a
  • [^a]          : Encaja en una cadena que no tiene una a
  • ^a[^a]: Ma marca una cadena comenzando con a seguido de cualquier carácter que no sea a.
+1

Eso es cierto si supone que esta expresión regular está entre comillas. De lo contrario, sería un literal '\'. –

+2

@Matt: supuse que por la etiqueta java. – mkb

+3

@Matt, creo que es una suposición segura dado el hecho de que si se quería decir la barra diagonal inversa literal, la expresión regular nunca habría coincidido con ninguna cadena. –

2

Partido principio de la línea o cadena seguido de un literal \ seguido por el principio de la línea o cadena seguido de cualquier carácter que no sea un espacio, retorno o carácter de nueva línea

+0

Aquí hay un sitio popular para aprender regex: http://www.regular-expressions.info/tutorial.html –

+0

Eso está mal: no se pueden tener dos marcadores de inicio de cadena/línea mediante '^' a menos que esté en '(? m)' modo. La respuesta más obvia es que se trata de líneas coincidentes que comienzan con un circunflejo seguido de cualquier carácter no circunflejo, pero esto es difícil de decir debido a los snobash Java de stooopid. – tchrist

+0

No dije que era correcto o que coincidiría con algo. Solo dije lo que dice. –

2

La primera ^ es el comienzo de la línea.

el segundo es un carácter literal de ^ (\ es escapar otro significado habitual de ^)

La tercera es decir

una clase de caracteres que no incluye la carácter ^

Algunos ejemplo para mostrar el uso de Ruby:

ruby-1.9.2-p0 > "hello" =~ /^h/ # it found a match at position 0 
=> 0 

ruby-1.9.2-p0 > "hello" =~ /^e/ # nil means can't find it 
=> nil 

ruby-1.9.2-p0 > "he^llo" =~ /\^/ # found at position 2 
=> 2 

ruby-1.9.2-p0 > "he^llo"[/[^^]*/] # anything repeatedly but not including the^character 
=> "he" 
+1

Excelente respuesta. – aioobe

+0

@ 動靜 能量 - ignoraste "el segundo" en tus ejemplos; solo coincidirá si las cadenas comienzan con un '^'. Y este '^' es parte de la coincidencia ("^ hel^lo" -> "^ hel") –

+0

el tercer caso en el ejemplo es mostrar la coincidencia del literal '^' ... es eso lo que quieres decir ? –

3

Estoy probando esta expresión regular here sin embargo, no parece ser válida.
El primer ^ indica el inicio de la línea.
El primer \ se escapa del siguiente \.
Por lo tanto, no se escapó el segundo "^" Finalmente, el primer símbolo de intercalación dentro de los corchetes [^ actúa como la negación y el segundo ^] no es válido, como resultado no es válido.

En mi humilde opinión, la expresión regular correcta debe ser ^\^[^\^]
Chicos, por favor confirmar.Muchas gracias

+2

Creo que hay una suposición implícita de que esto está entre comillas, por lo que las dos barras invertidas son necesarias para escapar del segundo símbolo de intercalación. –

+0

Gracias por eso, solo asegúrate – Philar

Cuestiones relacionadas