RegEx - избавиться от двойных пробелов? - PullRequest
2 голосов
/ 09 июля 2010

У меня есть приложение, которое заменяет «недопустимые» символы (как определено моим Regex) пробелом.Я хочу, чтобы, если в имени файла было 2 или более пробелов, обрезать один.Например:

Deal A & B.txt после запуска моего приложения будет переименовано в Deal A B.txt (3 пробела ч / б A и B).Что я действительно хочу, так это: Deal A B.txt (один пробел между A и B).

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

Кто-нибудь может мне помочь с этим?
Вот мой код для замены недопустимых символов:

public partial class CleanNames : Form
{
    public CleanNames()
    {
        InitializeComponent();

    }

    public void Sanitizer(List<string> paths)
    {
        string regPattern = (@"[~#&$!%+{}]+");
        string replacement = " ";

        Regex regExPattern = new Regex(regPattern);


        StreamWriter errors = new StreamWriter(@"S:\Testing\Errors.txt", true);
        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);
                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);
                    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);

                }




              }
            }
           catch (Exception e)
           {
               errors.Write(e);
           }


    }

    private void SanitizeFileNames_Load(object sender, EventArgs e)
    { }

    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {

    }

    private void button1_Click(object sender, EventArgs e)
    {
        Application.Exit();
    }


}

Проблема в том, что не все файлы после переименования будут иметьтакое же количество пробелов.Например, у меня может быть Deal A&B.txt, который после переименования станет Deal A B.txt (1 пробел ч / б A и B - это нормально).Но у меня также будут файлы, подобные: Deal A & B & C.txt, который после переименования будет: Deal A B C.txt (3 пробела между A, B и C - недопустимы).

У кого-нибудь есть идеи / код для того, как этого добиться?

Ответы [ 6 ]

5 голосов
/ 09 июля 2010

У местного эквивалента:

s/\s+/ /g;
4 голосов
/ 09 июля 2010

Просто добавьте пробел в свой regPattern. Любая коллекция недопустимых символов и пробелов будет заменена одним пробелом. Вы можете потратить немного времени на замену пробела пробелом, но, с другой стороны, вам не понадобится второй вызов манипуляции со строкой.

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

Помогает ли это?

        var regex = new System.Text.RegularExpressions.Regex("\\s{2,}");
        var result = regex.Replace("Some text  with a   lot      of spaces,   and 2\t\ttabs.", " ");
        Console.WriteLine(result);

вывод:

Some text with a lot of spaces, and 2 tabs.

Он просто заменяет любую последовательность из 2 или более пробельных символов одним пробелом ...


Редактировать:

Чтобы уточнить, я бы просто выполнил это регулярное выражение сразу после вашего существующего:

public void Sanitizer(List<string> paths)
{
    string regPattern = (@"[~#&$!%+{}]+");
    string replacement = " ";

    Regex regExPattern = new Regex(regPattern);
    Regex regExPattern2 = new Regex(@"\s{2,}");

и:

          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); // clean up whitespace
            string sanitized = System.IO.Path.Combine(pathOnly, sanitizedFileName);

Надеюсьэто имеет больше смысла.

1 голос
/ 09 июля 2010

Как сказал Фоско, с форматированием:

while (mystring.Contains("  ")) mystring = mystring.Replace("  "," ");

//                        ||                                 ||   |
1 голос
/ 09 июля 2010

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

@" +" -> " "

1 голос
/ 09 июля 2010

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

while (mystring.Contains("  ")) mystring = mystring.Replace("  "," ");

Я думаю, что это правильный синтаксис ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...