Замените первое слово последним словом в C#

Вот содержание моего .hgignore для проектов Visual Studio C#:

syntax: glob
*.user
*.ncb
*.nlb
*.suo
*.aps
*.clw
*.pdb
*\Debug\*
*\Release\*

Несколько примечаний:

  1. , Если у Вас есть пользовательские "выпуски" помимо "Отладки" и "Выпуск", Вы, возможно, должны добавить их.
  2. Быть осторожным, когда Вы вручную редактируете свой .hgignore. Если Вы сделаете синтаксическую ошибку, то hgtortoise больше не будет открывать диалоговое окно фиксации.
8
задан NETQuestion 11 November 2009 в 12:59
поделиться

6 ответов

string newString = Regex.Replace(oldString, @"^(\w+)(.+) \[(\w+)\]$", "$3$2");
17
ответ дан 3 November 2019 в 14:19
поделиться

Ради интереса я написал небольшой тест, чтобы проверить все эти ответы (включая мой другой ответ выше). Вот результаты на моей рабочей станции (32-битный Core 2 Duo @ 2,66 ГГц) для 5 миллионов повторений с использованием сборки Release:

  • LINQ: 10,545 секунд
  • мой способ Split + StringBuilder: 3,633 секунды
  • wipeck's Split-and- Присоединяйтесь! : 3,32 секунды
  • (некомпилированное) регулярное выражение: 3,845 секунды
  • (скомпилированное) регулярное выражение: 12,431 секунды

Результаты: решение wipeck Split-and-Join побеждает, но решение регулярного выражения (выбранное OP) составило только 15% медленнее, что меня удивило. Я ожидал на 100% хуже. Престижность разработчикам .NET Regex за скорость.

Мое собственное решение (с использованием Split и StringBuilder) было, как я думал, оптимизировано для скорости, но требует намного больше кода и на самом деле не делает его быстрым. Дох!

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

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

Вот тестовый код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

class Timer : IDisposable
{
    private DateTime _start;
    private string _name;

    public Timer(string name)
    {
        _name = name;
        _start = DateTime.Now;
    }
    public void Dispose()
    {
        TimeSpan taken = DateTime.Now - _start;
        Console.WriteLine(string.Format ("{0} : {1} seconds", _name, taken.TotalMilliseconds / 1000.0));
    }
}
class Program
{
    static void Main(string[] args)
    {
        int reps = 5000000;
        string oldString = "200 abc def abc [a18943]";

        using (new Timer("LINQ"))
        {
            for (int n = 0; n < reps; n++)
            {
                string[] a = oldString.Split(' ');
                var result = a.Skip(a.Length - 1)
                            .Select(w => w.Replace("[", "").Replace("]", ""))
                            .Concat(a.Take(a.Length - 1).Skip(1)).ToArray();

                var newString = string.Join(" ", result);
            }
        }

        using (new Timer("my Split + StringBuilder way"))
        {
            for (int n = 0; n < reps; n++)
            {
                string[] words = oldString.Split(' ');
                StringBuilder sb = new StringBuilder(words[words.Length - 1].Trim('[', ']'));
                for (int i = 1; i < words.Length - 1; i++)
                {
                    sb.Append(' ');
                    sb.Append(words[i]);
                }
                string newString = sb.ToString();
            }
        }

        using (new Timer("wipeck's Split-and-Join way!"))
        {
            for (int n = 0; n < reps; n++)
            {
                string valueString = "200 abc def abc [a18943]";
                string[] values = valueString.Split(' ');
                string lastWord = values[values.Length - 1];
                lastWord = lastWord.Trim('[', ']');
                values[0] = lastWord;
                string movedValueString = string.Join(" ", values, 0, values.Length - 1);
            }
        }

        using (new Timer("(uncompiled) regex"))
        {
            for (int n = 0; n < reps; n++)
            {
                string newString = Regex.Replace(@"^(\w+)(.+) \[(\w+)\]$", oldString, "$3$2");
            }
        }

        Regex regex = new Regex(@"^(\w+)(.+) \[(\w+)\]$", RegexOptions.Compiled);
        string newStringPreload = regex.Replace(oldString, "$3$2");
        using (new Timer("(compiled) regex"))
        {
            for (int n = 0; n < reps; n++)
            {
                string newString = regex.Replace(oldString, "$3$2");
            }
        }
    }
}
5
ответ дан 3 November 2019 в 14:19
поделиться
        string oldString = "200 abc def abc [a18943]";
        string[] values = oldString.Split(' ');
        string lastWord = values[values.Length - 1].Trim('[', ']');
        values[0] = lastWord;
        string newString = string.Join(" ", values, 0, values.Length - 1);
4
ответ дан 3 November 2019 в 14:19
поделиться

Попробуйте:

 Regex       : ^\w+(.*\s)\[(\w+)]$
 Replacement : $2$1
1
ответ дан 3 November 2019 в 14:19
поделиться

Это некрасиво, но работает.

string[] a = oldString.Split(' ');
var result = a.Skip( a.Length-1)
            .Select(w => w.Replace("[","").Replace("]",""))
            .Concat( a.Take( a.Length -1 ).Skip(1)).ToArray();

var newString = string.Join(" ", result);
0
ответ дан 3 November 2019 в 14:19
поделиться

Вот один из способов сделать это. Обратите внимание, что я предполагаю, что длина строки не менее 1 слова.

string oldString = "200 abc def abc [a18943]";
string[] words = oldString.Split(' ');
StringBuilder sb = new StringBuilder(words[words.Length-1].Trim('[', ']'));
for (int i = 1; i < words.Length-1; i++)
{
    sb.Append (" ");
    sb.Append (words[i]);
}
string newString = sb.ToString();

OOPS, исправлена ​​опечатка выше. Помогает мне писать код без предварительной компиляции. : -)

0
ответ дан 3 November 2019 в 14:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: