2009-07-08 2 views
6

Если я хочу, чтобы соответствовать только fileName, то есть,экстракт имя_файла с помощью Regex

в C://Directory/FileName.cs, как-то игнорировать все перед FileName.cs использованием Regex.

Как я могу это сделать?

Мне нужно это для скомпилированного пользовательского интерфейса, над которым я работаю ... не могу использовать язык программирования, поскольку он принимает только Regex.

Любые идеи?

+1

Я всегда удивляюсь, почему люди просят регулярное выражение, когда есть более простое решение. –

+0

@sumesh, сделал ли regEx, который я предоставил в своем ответе, работает для вас? если это не так, можете ли вы предоставить дополнительную информацию о том, какие конкретные функции regEx поддерживаются вашим движком? –

+0

Нет, это не сработало, этот движок поддерживает только Regex, есть два параметра 1st param. Файл для сканирования второго параметра. pattern to match Путь к файлу задается еще немного.Проблема здесь в том, что мое правило приложения говорит, что в имени файла не должно быть «abc», но abc может находиться в пути к файлу, например C: //folder/abc/folder/fileName.cs теперь как-то мне нужно пройти регулярное выражение так, чтобы движок только просматривал файл не весь путь. поэтому в первом параметре, если я могу указать fileName, то есть что-нибудь после /, но до .cs, каждый должен быть счастлив. – 2009-07-08 02:50:36

ответ

5

Какой язык вы используете? Почему вы не используете стандартные механизмы пути этого языка?

Как насчет http://msdn.microsoft.com/en-us/library/system.io.path.aspx?

+0

Это. В частности, метод GetFileName(). – Turnor

+0

Согласен, сначала api, регулярное выражение. –

13

Нечто подобное может работать:

[^/]*$ 

Он соответствует всем символам до конца строки, не «/» ..

Если вы хотите, чтобы соответствовать пути, которые используют символ «\ "Разделительный вы бы изменить регулярное выражение:

[^\]*$ 

Но убедитесь, чтобы избежать символ„\“, если ваш язык программирования или среда требует. Например, вы могли бы написать что-то вроде этого:

 
[^\\]*$ 

EDIT Я снял ведущий «/» и ведомые «/», поскольку они могут ввести в заблуждение, так как они не являются действительно частью Regex, но они очень часто представляют собой регулярное выражение.

И, конечно же, в зависимости от особенностей, которые поддерживает двигатель regEx, вы можете использовать внешний вид и внешний вид и захват для создания лучшего regEx.

+0

Вы всегда должны использовать две обратные косые черты в регулярном выражении, чтобы соответствовать одному в целевой строке. Если вы используете язык, подобный Java, который не предоставляет литералы регулярных выражений или строки raw/verbatim, вам нужно их избежать: "[^ \\\\] *" –

+0

lol я провел час, lookbehinds и finaly получили регулярное выражение с 100 символами для работы ... тогда я увидел ваш ... удалил весь внешний вид и все еще работал. : P – Victor

0

Я хотел бы использовать:. /(. $)

В скобках отмечена группа, которая является именем файла. Регулярное выражение, которое вы используете, может изменяться в dependig на синтаксисе регулярных выражений (PCRE, POSIX)

Я sugest использовать инструмент регулярных выражений, есть несколько окон и Linux:

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

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

Linux - кодо

Надеются, что это помогает

4

Основываясь на ваш комментарий о необходимости исключить пути, которые не соответствуют «ABC», попробуйте следующее:

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


Полностью разделить в режиме регулярных выражений комментария, то есть:

(?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

только вариация на miky's, которая работает для обоих символов пути файловой системы: [^\\/]*\s

0

Предположим, что файл na у меня есть специальные символы, особенно при поддержке MAC, где специальные символы разрешают имена файлов, сторона сервера Path.GetFileName (имя_файла) терпит неудачу и выдает ошибку из-за незаконных символов в пути. Следующий код с использованием regex подходит для спасения.

Следующая регулярное выражение уход берут из 2 вещей

  1. В IE, когда файл загружен, путь к файлу содержит папки как хорошо (т.е. C: \ samplefolder \ подпапка \ sample.xls). Выражение ниже заменит все папки пустой строкой и сохранит имя файла

  2. При использовании в Mac имя файла является единственной вещью, предоставленной в качестве браузера Safari, и позволяет использовать специальные символы в имени файла.

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

Я путь опоздал на вечеринку, и я также игнорируя требование регулярных выражений, поскольку, как J-16 SDiZ отметил, иногда есть лучшее решение. Несмотря на то, что вопрос 4 года, люди, которые ищут простое решение, заслуживают выбора.

Попробуйте использовать следующее:

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

Этот метод разбивает строку на символе «\», хранит результирующие строки в массиве и возвращает последний элемент массива (имя файла).

Хотя OP, похоже, пишет для UNIX, не нужно много разбираться в том, как адаптировать его к вашей конкретной потребности.

+0

Если вы идете по пути C#, почему бы не использовать [Path.GetFileNamewithoutExtension] (http://msdn.microsoft.com/en-us/library/system.io.path.getfilenameWithoutextension.aspx)? – keyboardP

+0

@keyboardP Это вариант, но в моем конкретном случае расширения важны как визуальная проверка. Кроме того, файловые пути, которые я использую, генерируются OpenFileDialog. Я использую только конвертер, чтобы создать сокращенную строку для пользовательского интерфейса, и, как упоминалось в OP, я занимаюсь сшиванием всего _before_ имени файла, а не после. – spugm1r3

Смежные вопросы