Tengo algunos datos que se ven así
john, dave, chris
rick, sam, bob
joe, milt, paul
Estoy usando esta expresión regular para que coincida con los nombres
/(\w.+?)(\r\n|\n|,)/
que funciona en su mayor parte, pero el archivo termina abruptamente después de la última palabra, lo 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 correctamente en esa segunda agrupación?
Respuestas:
La respuesta a esta pregunta
\Z
me tomó un tiempo darme cuenta, pero ahora funciona. Tenga en cuenta que por el contrario,\A
los partidos a partir de toda la cadena (en oposición a^
, y$
que coincide con el comienzo de una línea).fuente
(\s*)\?>(\s*)\Z
... y después de investigar un poco más, esto es lo que funcionaría en una carpeta de proyecto :(\s*)\?>(\s*)(\n*)(\W)\Z
FYI: esto es para reemplazar todas las etiquetas php de cierre por saltos de línea al final del archivo.\A
también funciona en Visual Studio buscar y reemplazar. Como siempre, use esas cosas con precaución, pero me ahorró un montón de líos manuales una vez que estaba feliz de que realmente haría lo correcto.Scanner
clase de Java para leer un archivo completo a la vez; si lo uso\Z
como delimitador, se recortó el carácter de nueva línea final. Cuando cambié el delimitador a\z
, se conservó el carácter de nueva línea final. Parece que la respuesta de Martin Dorey también se aplica a Java.EOF no es en realidad un personaje. Si tiene una cadena de varias líneas, entonces '$' coincidirá con el final de la cadena y con el final de una línea.
En Perl y sus hermanos,
\A
y\Z
empareja el principio y el final de la cadena, ignorando por completo los saltos de línea.Las extensiones GNU para expresiones regulares POSIX usan
\`
y\'
para las mismas cosas.fuente
En Visual Studio, puede encontrar EOF este modo:
$(?![\r\n])
. Esto funciona si sus finales de línea son CR, CRLF o simplemente LF.Como beneficio adicional, puede asegurarse de que todos sus archivos de código tengan un marcador de nueva línea final como este:
Find What: (?<![\r\n])$(?![\r\n]) Replace With: \r\n Use Regular Expressions: checked Look at these file types: *.cs, *.cshtml, *.js
Como funciona esto:
Busque cualquier final de línea (una coincidencia de ancho cero) que no esté precedido por CR o LF, y que tampoco esté seguido por CR o LF. ¡Un poco de pensamiento le mostrará por qué funciona esto!
Tenga en cuenta que debe Reemplazar con el carácter de final de línea deseado, ya sea CR, LF o CRLF.
fuente
Contraste el comportamiento de \ Z sugerido por Ryan con \ z:
perlre sez:
Una traducción del caso de prueba a Ruby (1.8.7, 1.9.2) se comporta de la misma manera.
fuente
¿Realmente tienes que capturar los separadores de línea? Si no, esta expresión regular debería ser todo lo que necesita:
/\w+/
Eso es asumiendo que todas las subcadenas que desea hacer coincidir consisten completamente en caracteres de palabra, como en su ejemplo.
fuente
¿Quizás probar $ (EOL / EOF) en lugar de (\ r \ n | \ n)?
/\"(.+?)\".+?(\w.+?)$/
fuente
Recientemente estaba buscando algo como esto, pero para JavaScript.
Poner esto aquí, para que cualquier persona con el mismo problema pueda beneficiarse
var matchEndOfInput = /$(?![\r\n])/gm;
Básicamente, esto coincidiría con el final de la línea, que no va seguido de un retorno de carro o de caracteres de nueva línea. En esencia, esto es lo mismo que
\Z
pero para JavaScript.fuente
Suponiendo que está utilizando el forzado de modificador adecuado para tratar la cadena como un todo (no línea por línea, y si \ n funciona para usted, lo está usando), simplemente agregue otra alternativa: final de cadena: (\ r \ n | \ n |, | $)
fuente
/(\w.+?)(\r\n|\n|,|$)/
fuente