2009-07-08 18 views
6

Si sólo se desea detectar fileName, es decir,nomArchivo extracto usando expresiones regulares

en C://Directory/FileName.cs, de alguna manera ignorar todo antes de FileName.cs usando expresiones regulares.

¿Cómo puedo hacerlo?

Necesito esto para una interfaz de usuario compilada en la que estoy trabajando ... no puedo usar el lenguaje de programación ya que solo acepta Regex.

¿Alguna idea?

+1

siempre me pregunto por qué las personas solicitan expresiones regulares cuando hay una solución más simple. –

+0

@sumesh, ¿el regEx que proporcioné en mi trabajo de respuesta para usted? si no fuera así, ¿puede proporcionar más información sobre qué características específicas de regEx son compatibles con su motor? –

+0

No, no funcionó, Este motor solo admite Regex, hay dos parametros 1er parámetro. Archivo para escanear el 2 ° param. patrón para hacer coincidir La ruta al archivo se especifica de alguna otra manera.El problema aquí es que mi regla de aplicación dice que no debe haber "abc" en un nombre de archivo, pero abc puede estar en la ruta del archivo, por ejemplo, C: //folder/abc/folder/fileName.cs ahora de alguna manera tengo que pasar una expresión regular para que el motor solo escanee el archivo, no toda la ruta. entonces, en el primer parámetro, si puedo especificar el nombre del archivo, es decir, cualquier cosa después de/.cs antes de .cs, todos deberían estar contentos. –

Respuesta

13

Algo como esto podría funcionar:

[^/]*$ 

Coincide con todos los caracteres hasta el final de la línea que no están "/" ..

Si desea hacer coincidir los caminos que utilizan el "\ "separador de ruta que iba a cambiar la expresión regular a:

[^\]*$ 

pero asegúrese de escapar el carácter '\' si su lenguaje de programación o entorno lo requiere. Por ejemplo, usted podría tener que escribir algo como esto:

 
[^\\]*$ 

EDITAR que eliminan el principal "/" y "/" al, ya que pueden ser confusas ya que no son realmente parte de la expresión regular, pero son muy comunes de representar una expresión regular.

Y, por supuesto, dependiendo de las características que admita el motor regEx, es posible que pueda usar look-ahead/look-behind y capture para crear un mejor regEx.

+0

Siempre debe usar dos barras diagonales inversas en la expresión regular para que coincida con una en la cadena de destino. Si está utilizando un lenguaje como Java que no proporciona los literales de expresiones regulares o cadenas crudas/verbatim, debe hacer doble escape de ellos: "[^ \\\\] *" –

+0

lol pasé como una hora jugando con lookbehinds y finalmente obtuve una expresión regular con 100 caracteres para trabajar ... luego vi la tuya ... eliminé todas las miradas atrás y aún así funcionó. : P – Victor

0

Yo usaría:. /(. $)

Los paréntesis marcan un grupo que es el nombre del archivo. La expresión regular se utiliza puede variar dependig sobre la sintaxis de expresiones regulares (PCRE, POSIX)

I sugest utiliza una herramienta de expresiones regulares, hay varios para Windows y Linux:

de Windows - http://sourceforge.net/projects/regexcreator/

de Windows - http://weitz.de/regex-coach/

Linux - kodos

creo que sirve

4

Basado en su comentario de la necesidad de excluir rutas que no coinciden con 'abc', intente esto:

^.+/(?:(?!abc)[^/])+$ 


Completamente dividir a cabo en el modo de comentario expresiones regulares, es decir:

(?x)  # flag to enable comments 
^  # start of line 

.+  # match any character (except newline) 
     # greedily one or more times 
/  # a literal slash character 

(?:  # begin non-capturing group 
    (?!  # begin negative lookahead 
      # (contents must not appear after the current position) 
    abc  # literal text abc 
)  # end negative lookahead 
    [^/]  # any character that is not a slash 
)  # end non-capturing group 
+  # repeat the above nc group one or more times 
     # (essentially, we keep looking for non-backspaces that are not 'abc') 

$  # end of line 
0

simplemente una variación de miky que funciona para ambos caracteres de ruta del sistema de archivos: [^\\/]*\s

0

Supongamos que el archivo na yo tengo caracteres especiales, especialmente cuando soporto MAC donde los caracteres especiales permiten nombres de archivo, el servidor Path.GetFileName (fileName) falla y arroja un error debido a caracteres ilegales en la ruta. El siguiente código que usa regex viene para el rescate.

La siguiente expresión regular cuidar de 2 cosas

  1. En IE, cuando se carga el archivo, la ruta del archivo contiene carpetas aswell (es decir, c: \ SampleFolder \ subcarpeta \ Sample.xls). La siguiente expresión reemplazará todas las carpetas con una cadena vacía y conservará el nombre de archivo

  2. Cuando se utiliza en Mac, el nombre del archivo es el único que se proporciona como su navegador safari y permite caracteres especiales en el nombre del archivo.

    var regExpDir = @"(^[\w]:\\)([\w].+\w\\)"; 
    
    var fileName = Regex.Replace(fileName, regExpDir, string.Empty); 
    
1

estoy manera tarde a la fiesta y también estoy haciendo caso omiso de la exigencia de expresiones regulares porque, como J-16 SDiZ señaló, a veces hay una solución mejor. Aunque la pregunta tiene 4 años, las personas que buscan una solución simple merecen opciones.

intente utilizar el siguiente:

public string ConvertFileName(string filename) 
    { 
     string[] temparray = filename.Split('\\'); 
     filename = temparray[temparray.Length - 1]; 
     return filename; 
    } 

Este método divide la cadena en el carácter "\", almacena las cadenas resultantes de una matriz y devuelve el último elemento de la matriz (el nombre del archivo).

Aunque el OP parece estar escribiendo para UNIX, no se necesita mucho para encontrar la manera de adaptarlo a sus necesidades particulares.

+0

Si va por la ruta C#, ¿por qué no utiliza [Path.GetFileNamewithouttension] (http://msdn.microsoft.com/en-us/library/system.io.path.getfilenameWithoutextension.aspx)? – keyboardP

+0

@keyboardP Esa es una opción, pero en mi caso particular, las extensiones son importantes como una verificación visual. Además, los filepaths que estoy usando son generados por un OpenFileDialog. Solo uso el convertidor para crear una cadena abreviada para la interfaz de usuario y, como menciona el OP, me preocupa no aceptar todo antes del nombre del archivo, no después. – spugm1r3

Cuestiones relacionadas