Problems resolving multiple periods in FileName

I am trying to take file names that look like this:
MAX_1.01.01.03.pdf look like Max_1010103.pdf.

I currently have this code:

public void Sanitizer(List<string> paths) { string regPattern = (@"[~#&!%+{}]+"); string replacement = " "; Regex regExPattern = new Regex(regPattern); Regex regExPattern2 = new Regex(@"\s{2,}"); Regex regExPattern3 = new Regex(@"\.(?=.*\.)"); string replace = ""; var filesCount = new Dictionary<string, int>(); dataGridView1.Rows.Clear(); try { foreach (string files2 in paths) { string filenameOnly = System.IO.Path.GetFileName(files2); string pathOnly = System.IO.Path.GetDirectoryName(files2); string sanitizedFileName = regExPattern.Replace(filenameOnly, replacement); sanitizedFileName = regExPattern2.Replace(sanitizedFileName, replacement); string sanitized = System.IO.Path.Combine(pathOnly, sanitizedFileName); if (!System.IO.File.Exists(sanitized)) { DataGridViewRow clean = new DataGridViewRow(); clean.CreateCells(dataGridView1); clean.Cells[0].Value = pathOnly; clean.Cells[1].Value = filenameOnly; clean.Cells[2].Value = sanitizedFileName; dataGridView1.Rows.Add(clean); System.IO.File.Move(files2, sanitized); } else { if (filesCount.ContainsKey(sanitized)) { filesCount[sanitized]++; } else { filesCount.Add(sanitized, 1); string newFileName = String.Format("{0}{1}{2}", System.IO.Path.GetFileNameWithoutExtension(sanitized), filesCount[sanitized].ToString(), System.IO.Path.GetExtension(sanitized)); string newFilePath = System.IO.Path.Combine( System.IO.Path.GetDirectoryName(sanitized), newFileName); newFileName = regExPattern2.Replace(newFileName, replacement); System.IO.File.Move(files2, newFilePath); sanitized = newFileName; DataGridViewRow clean = new DataGridViewRow(); clean.CreateCells(dataGridView1); clean.Cells[0].Value = pathOnly; clean.Cells[1].Value = filenameOnly; clean.Cells[2].Value = newFileName; dataGridView1.Rows.Add(clean); } //HERE IS WHERE I AM TRYING TO GET RID OF DOUBLE PERIODS// if (regExPattern3.IsMatch(files2)) { string filewithDoublePName = System.IO.Path.GetFileName(files2); string doublepPath = System.IO.Path.GetDirectoryName(files2); string name = System.IO.Path.GetFileNameWithoutExtension(files2); string newName = name.Replace(".", ""); string filesDir = System.IO.Path.GetDirectoryName(files2); string fileExt = System.IO.Path.GetExtension(files2); string newPath = System.IO.Path.Combine(filesDir, newName+fileExt); DataGridViewRow clean = new DataGridViewRow(); clean.CreateCells(dataGridView1); clean.Cells[0].Value =doublepPath; clean.Cells[1].Value = filewithDoublePName; clean.Cells[2].Value = newName; dataGridView1.Rows.Add(clean); } } } catch (Exception e) { throw; //errors.Write(e); } } 

I ran this and instead of getting rid of the TOTAL period (minus the period before the file extension), I get results such as: MAX_1.0103.pdf

If there are several periods like: Test....1.txt , I get the following results: Test...1.txt

It seems that he gets rid of only ONE period. I am new to regular expressions and this is REQUIREMENT for this project. Can someone help me figure out what I'm doing wrong here?

Thanks!

EDITED to show changes made to code

+4
source share
5 answers

Why not use the Path class :

 string name = Path.GetFileNameWithoutExtension(yourPath); string newName = name.Replace(".", ""); string newPath = Path.Combine(Path.GetDirectoryName(yourPath), newName + Path.GetExtension(yourPath)); 

Each step is separated for clarity.

So for input

"C: \ Users \ Fred \ MAX_1.01.01.03.pdf"

I get a conclusion

"C: \ Users \ Fred \ MAX_1010103.pdf"

as I expected.

If I put:

"C: \ Users \ Fred.Flintstone \ MAX_1.01.01.03.pdf"

I get:

"C: \ Users \ Fred.Flintstone \ MAX_1010103.pdf"

again, what I expect, since I am not processing the "DirectoryName" part of the path.

NOTE I skipped a bit that RegEx is REQUIRED. However, still sticking to this answer.

+12
source

Tell me, have you already asked this question ?

Anyway, I stick with my original answer :

 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); } 

Now, since you indicated that you should use RegEx, I suppose you can always force it there:

 string RemovePeriodsFromFilename(string fullPath) { string dir = Path.GetDirectoryName(fullPath); string filename = Path.GetFileNameWithoutExtension(fullPath); // Look! Now the solution uses RegEx! string sanitized = Regex.Replace(filename, @"\.", string.Empty); string ext = Path.GetExtension(fullPath); return Path.Combine(dir, sanitized + ext); } 

Note. This is basically the same approach that ChrisF has proposed.

Anyone who requires you to use RegEx, I suggest you explain why.

+2
source

I would rework all regular expressions, do the following:

  • Replace all periods with blank lines
  • Replace last 3 characters with ("." + Last 3 characters)
0
source

This regular expression will delete all periods except for periods up to 3 or 4 letters.

 string filename = "test.test......t.test.pdf"; string newFilename = new Regex(@"\.(?!(\w{3,4}$))").Replace(filename, ""); 

If you want it to work with two letter extensions, just change {3,4} to {2,4}

Good luck

0
source

Something like this might be:

 string fileName = "MAX_1.01.01.03.pdf"; fileName = fileName.Substring(0, 1).ToUpper() + fileName.Substring(1).ToLower(); fileName = fileName.Replace(".", ""); 
-1
source

Source: https://habr.com/ru/post/1316314/


All Articles