Regex ¿Última aparición?

122

Estoy tratando de capturar la última parte después de la última barra invertida.Necesito
el \Web_ERP_Assistant(con el \)

Mi idea fue:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

Pero no puedo encontrarlo.

[Regexer Demo]

Royi Namir
fuente
2
Aprecio que su pregunta se refiera a las expresiones regulares, pero ¿está seguro de que esta es la mejor herramienta para usar aquí? La mayoría de las bibliotecas estándar tendrán un método que recuperará el último nombre de ruta en un directorio determinado. Esto también tiene en cuenta cuál es el separador de directorios en un sistema operativo determinado.
Steve Rukuts
@Raskolnikov Necesito eso en expresiones regulares. Conozco el Pth.getFileNameWithoutExtension. La PREGUNTA está etiquetada como expresión regular
Royi Namir
2
Está bien, es justo, solo asegúrate. Entonces se lo dejaré a las personas más expertas en expresiones regulares.
Steve Rukuts

Respuestas:

95

Su solución de anticipación negativa sería, por ejemplo, esta:

\\(?:.(?!\\))+$

Verlo aquí en RegExr

stema
fuente
2
El (?:es el comienzo de un grupo sin captura. El .es cualquier carácter, esto verifica cualquier carácter si no va seguido de un ``.
stema
La línea múltiple es solo para la prueba Regexr necesaria. Cambia el significado del $. Estándar es el final de la cadena, con Multiline su final de la fila. Debido a que el texto de prueba en Regexr tiene varias filas, necesito esta opción allí.
stema
¿Qué pasa si quiero el mismo reqeust que mi pregunta original, pero sin el \ al principio?
Royi Namir
2
(?:[^\\/](?!(\\|/)))+$elimina la barra al principio y hace frente a las barras inclinadas hacia adelante y hacia atrás. También hace coincidir la cadena completa para las rutas sin barras inclinadas, por ejemplo, manual.doc
mrswadge
5
En un codicioso simbólico templado, el punto siempre debe venir en pos de la búsqueda hacia delante: (?:(?!\\).)+. ( ref ) Además, su ejemplo en RegExr usa dos barras invertidas para separar los componentes de la ruta; debe haber solo uno, y la expresión regular debe coincidir solo con uno. ( demo )
Alan Moore
62

Uno que funcionó para mí fue:

.+(\\.+)$

¡Pruébelo en línea!

Explicación:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string
Jeeter
fuente
16
Gracias por el desglose de las partes :)
Jason Bruce
1
Estaba buscando específicamente una expresión regular que coincida con la última barra diagonal (/). Resulta que la respuesta aceptada anteriormente por @stema hace el trabajo cuando la barra invertida se reemplaza por una barra inclinada. El suyo coincide con todo lo que sigue a CADA barra, que realmente no es la solución buscada. Elegí tu respuesta porque tu explicación fue concisa, aunque tu solución realmente no
funcionó
Esto es mucho más simple y, en general, mejor que una búsqueda anticipada negativa, siempre que no se interrumpa en una línea, ¿por qué complicar demasiado?
Scott Anderson
42

Una mirada negativa al futuro es una respuesta correcta, pero se puede escribir de manera más clara como:

(\\)(?!.*\\)

Esto busca una aparición de \ y luego, en una comprobación que no coincide, busca cualquier número de caracteres seguido del carácter que no desea ver después. Debido a que es negativo, solo coincide si no encuentra una coincidencia.

Hora
fuente
4
Esto coincide con la última barra invertida solamente . El OP también quiere hacer coincidir todo lo que sigue.
Alan Moore
Muy útil, esta versión más limpia, aunque solo capturaba la barra invertida, hizo que todo hiciera clic. Gracias.
Matt Binford
28

Puedes intentar anclarlo al final de la cuerda, algo así como \\[^\\]*$. Aunque no estoy seguro de si es absolutamente necesario usar expresiones regulares para la tarea.

Michael Krelin - hacker
fuente
2
Esto funciono muy bien para mi. ([^\/]*)$coincide con el nombre del archivo en una ruta para un cuadro de Linux. ¿Puede explicar cómo funciona el símbolo de intercalación ^en este contexto? Solo lo he usado para indicar el comienzo de las cadenas.
Brad
@Brad, es negación. El significado [^\/]coincide con cualquier carácter excepto /.
Michael Krelin - hacker
9

¿Qué pasa con esta expresión regular: \\[^\\]+$

SERPRO
fuente
Bueno, no creo que deba estar en la expresión regular. Pero
editaré
err ... No creo que deba ser regex en absoluto, pero ciertamente para que Match lo incluya, debería estar dentro. No es que importe, acabo de pensar en lo que podría estar mal en tu respuesta después de verla fue votado en contra y esto fue lo que se me ocurrió, así que comenté.
Michael Krelin - hacker
@michael, no me malinterpretes, aprecio tu comentario, pensé que no es necesario agregarlo en la expresión regular \;)
SERPRO
5

Si no desea incluir la barra invertida, sino solo el texto posterior, intente esto: ([^\\]+)$o para Unix:([^\/]+)$

Katja
fuente
2

Usé la expresión regular a continuación para obtener ese resultado también cuando terminó con un \

(\\[^\\]+)\\?$

[Regex Demo]

shA.t
fuente