Избавление от нескольких периодов в имени файла с помощью RegEx - PullRequest
1 голос
/ 16 июля 2010

У меня есть приложение, которое требует, чтобы я "чистил" "грязные" имена файлов.

Мне было интересно, знает ли кто-нибудь, как обращаться с файлами с такими именами, как:

1.0.1.21 - конфиденциально ... doc или же Accounting.Files.doc

В принципе, нет гарантии, что точки будут в одном и том же месте для каждого имени файла. Я надеялся выполнить поиск по диску, найти точки в самом имени файла (без расширения), удалить точку и затем добавить расширение к нему.

Кто-нибудь знает или лучший способ сделать это или как выполнить то, что я надеюсь сделать? Как примечание, regEx является ТРЕБОВАНИЕМ для этого проекта.

РЕДАКТИРОВАТЬ: вместо просмотра 1.0.1.21 - Конфиденциально ... документ, я хотел бы видеть: 10121 - Confidential.doc
Для другого имени файла вместо Accounting.Files.doc я хотел бы видеть AccountingFiles.doc

Ответы [ 3 ]

6 голосов
/ 16 июля 2010

Вы можете сделать это с помощью регулярного выражения:

string s = "1.0.1.21 -- Confidential...doc";
s = Regex.Replace(s, @"\.(?=.*\.)", "");
Console.WriteLine(s);

Результат:

10121 -- Confidential.doc

Регулярное выражение можно разбить следующим образом:

\.    match a literal dot
(?=   start a lookahead 
.*    any characters
\.    another dot
)     close the lookahead

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

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

2 голосов
/ 17 июля 2010

Я бы сделал это без регулярных выражений *.(Отказ от ответственности: я не очень хорошо разбираюсь в регулярных выражениях, вот почему.)

Рассмотрим этот вариант.

string RemovePeriodsFromFilename(string fullPath)
{
    string dir = Path.GetDirectoryName(fullPath);
    string filename = Path.GetFileNameWithoutExtension(fullPath);
    string sanitized = filename.Replace(".", string.Empty);
    string ext = Path.GetExtension(fullPath);

    return Path.Combine(dir, sanitized + ext);
}

* Ой ,похоже, вы сказали, что использование регулярных выражений было требованием .Не берите в голову!(Хотя я должен спросить: почему ?)

2 голосов
/ 17 июля 2010

Вот альтернативное решение, которое не использует регулярные выражения - возможно, оно более читабельно:

string s = "1.0.1.21 -- Confidential...doc";
int extensionPoint = s.LastIndexOf(".");
if (extensionPoint < 0) {
    extensionPoint = s.Length;
}
string nameWithoutDots = s.Substring(0, extensionPoint).Replace(".", "");
string extension = s.Substring(extensionPoint);
Console.WriteLine(nameWithoutDots + extension);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...