转到字符串中的每个空格.C#.

本文关键字:空格 字符串 | 更新日期: 2023-09-27 18:28:44

是否可以传递字符串,找到空格?

例如,以下数据集:

string myString = "aa bbb cccc dd";

如何遍历和检测每个空白区域,并操纵该空格?

我需要以最有效的方式做到这一点。

谢谢。

更新:
我需要通过从整数值增加空格来操作空格。因此,例如,将空间增加到 3 个空格而不是一个。我想让它在一个循环中穿过每个空格,有什么方法已经在 .NET 中做到这一点吗?我所说的空格是指" '。

转到字符串中的每个空格.C#.

您可以使用

Regex.Replace方法。这将用破折号替换任何一组空格字符:

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

更新:

这将找到空格字符组,并替换为空格的 tripple 数量:

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

但是,使用正则表达式有点太简单了。您可以使用常规替换执行相同的操作:

myString = myString.Replace(" ", "   ");
这将替换替换

空间组中的每个空格,但常规替换比Regex.Replace简单得多,因此它仍然应该至少一样快,并且代码更简单。

如果你想一

举替换所有空格,你可以这样做:

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

如果您只想用其他字符替换所有空格:

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

如果您需要对每个执行不同操作的可能性:

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

编辑:

根据您的评论澄清您的问题:

要将每个空格更改为三个空格,可以执行以下操作:

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

但请注意,这不会考虑输入字符串已经有两个或更多空格的情况。如果有可能,您将需要使用正则表达式。

取决于你要做什么:

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

使用 string.Replace() .

string newString = myString.Replace(" ", "   ");
下面的

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

如果你想用例如'_'替换空格,你可以使用String.Replace。

例:

string myString = "aa bbb cccc dd";
string newString = myString.Replace(" ", "_"); // gives aa_bbb_cccc_dd
如果你想

left/right justify你的字符串

int N=10;
string newstring = String.Join(
        "",
        myString.Split(' ').Select(s=>s.PadRight(N-s.Length)));