Перейти к каждому пробелу в строке. C # - PullRequest
0 голосов
/ 23 марта 2012

Можно ли обойти строку, найдя пробелы?

Например, набор данных:

string myString = "aa bbb cccc dd";

Как я могу пройти и обнаружить каждое пустое пространство и манипулировать этим пространством?

Мне нужно сделать это максимально эффективным способом.

Спасибо.

UPDATE:
Мне нужно манипулировать пространством, увеличивая пустое пространство от целочисленного значения. Так, например, увеличьте пространство, чтобы иметь 3 пробела вместо одного. Я хотел бы, чтобы он проходил через все пробелы в одном цикле, любой способ сделать это уже в .NET? Под пробелом я подразумеваю ''.

Ответы [ 9 ]

6 голосов
/ 23 марта 2012

Вы можете использовать метод Regex.Replace. Это заменит любую группу символов пробела на тире:

myString = Regex.Replace(myString, "(\s+)", m => "-");

Обновление:

Это позволит найти группы пробелов и заменить их на тройное количество пробелов:

myString = Regex.Replace(
  myString,
  "( +)",
  m => new String(' ', m.Groups[1].Value.Length * 3)
);

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

myString = myString.Replace(" ", "   ");

Это заменит каждое целое число пробелов из групп замены, но регулярная замена намного проще, чем Regex.Replace, поэтому все равно она должна быть как минимум такой же быстрой, а код проще.

5 голосов
/ 23 марта 2012

Если вы хотите заменить все пробелы одним махом, вы можете сделать:

// changes all strings to dashes
myString.Replace(' ', '-');

Если вы хотите перейти к каждому случаю (то есть, не просто заменить), вы можете выполнить циклIndexOf():

int pos = myString.IndexOf(' ');

while (pos >= 0)
{
    // do whatever you want with myString @ pos

    // find next
    pos = myString.IndexOf(' ', pos + 1);
}

ОБНОВЛЕНИЕ

Согласно вашему обновлению, вы можете заменить отдельные пробелы на количество пробелов, указанное в переменной (например, numSpaces ) следующим образом:

myString.Replace(" ", new String(' ', numSpaces));
2 голосов
/ 23 марта 2012

Запрос LINQ ниже возвращает набор элементов анонимного типа с двумя свойствами: «sybmol» представляет символ пробела, а «index» - индекс во входной последовательности.После этого у вас есть все пробельные символы и позиция во входной последовательности, теперь вы можете делать с этим все, что хотите.

string myString = "aa bbb cccc dd";
var res = myString.Select((c, i) => new { symbol = c, index = i })
                  .Where(c => Char.IsWhiteSpace(c.symbol));

РЕДАКТИРОВАТЬ: Для образовательных целей ниже приводится реализация, которую вы ищете, но, очевидно, вреальная система использует встроенный строковый конструктор и String.Replace(), как показано в других ответах

string myString = "aa bbb cccc dd";
var result = this.GetCharacters(myString, 5);
string output = new string(result.ToArray());


public IEnumerable<char> GetCharacters(string input, int coeff)
{
    foreach (char c in input)
    {
        if (Char.IsWhiteSpace(c))
        {
            int counter = coeff;
            while (counter-- > 0)
            {
                yield return c;
            }
        }
        else
        {
            yield return c;
        }
    }
}
2 голосов
/ 23 марта 2012

Если вы просто хотите заменить все пробелы другим символом:

myString = myString.Replace(' ', 'x');

Если вам нужна возможность сделать что-то другое для каждого:

foreach(char c in myString)
{
    if (c == ' ')
    {
        // do something
    }
}

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

За ваш комментарий, уточняющий ваш вопрос:

Чтобы изменить каждый пробел на три пробела, вы можете сделать это:

myString = myString.Replace(" ", "   ");

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

2 голосов
/ 23 марта 2012

В зависимости от того, что вы пытаетесь сделать:

for(int k = 0; k < myString.Length; k++)
{
   if(myString[k].IsWhiteSpace())
   {
       // do something with it
   }
}

Выше приведен один проход через строку, поэтому это O (n).Вы не можете добиться большей эффективности, чем это.

Однако, если вы хотите манипулировать исходной строкой, лучше всего использовать StringBuilder для обработки изменений:

StringBuilder sb = new StringBuilder(myString);
for(int k = 0; k < myString.Length; k++)
{
   if(myString[k].IsWhiteSpace())
   {
       // do something with sb
   }
}

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

Например, вот способ сопоставить все пробелы:

var rex = new System.Text.RegularExpressions.Regex("[^\\s](\\s+)[^\\s]");
var m = rex.Match(myString);
while(m.Success)
{
    // process the match here..

    m.NextMatch();
}

А вот способ заменить все пробелы произвольной строкой:

var rex = new System.Text.RegularExpressions.Regex("\\s+");
String replacement = "[white_space]";
// replaces all occurrences of white space with the string [white_space]
String result = rex.Replace(myString, replacement);
1 голос
/ 23 марта 2012

На случай, если вы хотите left/right justify вашу строку

int N=10;
string newstring = String.Join(
        "",
        myString.Split(' ').Select(s=>s.PadRight(N-s.Length)));
1 голос
/ 23 марта 2012

Использование string.Replace().

string newString = myString.Replace(" ", "   ");
1 голос
/ 23 марта 2012

Если вы хотите заменить пробел, например, '_', вы можете использовать String.Replace .

Пример:

string myString = "aa bbb cccc dd";
string newString = myString.Replace(" ", "_"); // gives aa_bbb_cccc_dd
1 голос
/ 23 марта 2012
var result = new StringBuilder();

foreach(Char c in myString)
{
   if (Char.IsWhiteSpace(c))
   {
       // you can do what you wish here. strings are immutable, so you can only make a copy with the results you want... hence the "result" var.

      result.Append('_'); // for example, replace space with _
   }
   else result.Append(c);

}

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