2009-07-23 39 views
59

tengo algunos datos que se ven asíexpresiones regulares para que coincida con EOF

john, dave, chris 
rick, sam, bob 
joe, milt, paul 

estoy usando esta expresión regular para coincidir con los nombres

/(\w.+?)(\r\n|\n|,)/ 

que trabaja en su mayor parte, pero el archivo termina abruptamente después de la última palabra que significa que el último valor no termina en \r\n, \n o , termina con EOF. ¿Hay alguna manera de hacer coincidir EOF en expresiones regulares para que pueda ponerlo en la segunda agrupación?

+0

¿Está tratando de capturar todos los nombres en un grupo o un grupo de captura por nombre? –

+4

¿Qué plataforma es esta? –

+0

Una cosa para hacer cuando tienes problemas con la expresión regular es probar elementos de tu patrón de forma aislada. si le preocupa el token al final, pruebe su expresión sin él. – akf

Respuesta

117

La respuesta a esta pregunta es \Z me llevó un tiempo averiguarlo, pero funciona ahora. Tenga en cuenta que, a la inversa, \A coincide con el principio de toda la cadena (a diferencia de ^ y $ que coinciden con el comienzo de una línea).

+3

Solo un aviso si buscas una fonctionality en netbeans para ** buscar archivos de proyecto ** en lugar de ** en búsqueda de archivos **, lo siguiente se comportará de manera diferente ... '(\ s *) \ ?> (\ s *) \ Z' ... y después de profundizar más aquí, ¿qué funcionaría en una carpeta de proyectos: '(\ s *) \?> (\ s *) (\ n *) (\ W) \ Z' FYI: esto es para reemplazar todas las etiquetas de php de cierre por saltos de línea al final del archivo. – MediaVince

+1

Resulta que '\ A 'también funciona en Visual Studio para buscar y reemplazar. Como siempre uso estas cosas con precaución, pero me ahorró un montón de errores manuales una vez que estaba contento de que realmente hiciera lo correcto. –

+0

Mientras estoy usando la clase 'Scanner' de Java para leer un archivo completo a la vez; si uso '\ Z' como delimitador, el carácter de nueva línea final se recorta. Cuando cambié el delimitador a '\ z', se conserva el carácter de nueva línea al final. Parece que [la respuesta de Martin Dorey] (https://stackoverflow.com/a/13651321/471214) también se aplica a Java. – mmdemirbas

1

Suponiendo que está utilizando el modificador adecuado para tratar la cadena como un todo (no línea por línea, y si \ n funciona para usted, lo está utilizando), simplemente agregue otra alternativa - fin de cadena: (\ r \ n | \ n |, | $)

0

/(\w.+?)(\r\n|\n|,|$)/

+2

Probablemente quiso decir '\ w +', ¿verdad? – Abel

+4

Probablemente. No recuerdo más :-) – cube

17

EOF no es en realidad un personaje. Si tiene una cadena de varias líneas, entonces '$' coincidirá con el final de la cadena, así como el final de una línea.

En Perl y sus hermanos, \A y \Z coinciden con el principio y el final de la cadena, haciendo caso omiso de los saltos de línea.

Las extensiones de GNU para las expresiones regulares POSIX usan \` y \' para las mismas cosas.

2

¿Realmente tiene que capturar los separadores de línea? Si no es así, esta expresión regular debería ser todo lo que necesita:

/\w+/ 

eso asumiendo todas las subcadenas que desea hacer coincidir contener solamente caracteres de texto, al igual que en su ejemplo.

2

Quizás intente $ (EOL/EOF) en lugar de (\ r \ n | \ n)?

/\"(.+?)\".+?(\w.+?)$/ 
6

contraste el comportamiento de Ryan sugerido \ Z con \ z:

 
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\Z/world/g; print(":$corpus:\n")' 
:helloworld 
world: 
$ perl -we 'my $corpus = "hello\n"; $corpus =~ s/\z/world/g; print(":$corpus:\n")' 
:hello 
world: 
$ 

perlre Sez:

 
\Z Match only at end of string, or before newline at the end 
\z Match only at end of string 

Una traducción del caso de prueba en Rubí (1.8.7, 1.9 .2) se comporta de la misma manera.

7

En Visual Studio, puede encontrar EOF como lo siguiente: $(?![\r\n]). Esto funciona si las terminaciones de línea son CR, CRLF o solo LF.

Como beneficio adicional, se puede asegurar que todos los archivos de código tienen un marcador de nueva línea final de este modo:

   Find What: (?<![\r\n])$(?![\r\n]) 
      Replace With: \r\n 
Use Regular Expressions: checked 
Look at these file types: *.cs, *.cshtml, *.js 

¿Cómo funciona esto:

encontrado ningún extremo de la línea (un partido de anchura cero) que no está precedido por CR o LF, y tampoco es seguido por CR o LF. ¡Algunos pensamientos te mostrarán por qué esto funciona!

Tenga en cuenta que debe reemplazar con el carácter de final de línea que desee, ya sea CR, LF o CRLF.

+0

¡Fantástico! Gracias – MikeMurko

0

Recientemente estuve buscando algo como esto, pero para JavaScript.

poner esto aquí, por lo que cualquier persona con el mismo problema puede beneficiarse

var matchEndOfInput = /$(?![\r\n])/gm; 

Básicamente esto coincidiría con el final de la línea, que no vaya seguida de retorno de carro o caracteres de nueva línea. En esencia, esto es lo mismo que \Z pero para JavaScript.

Cuestiones relacionadas