繁体   English   中英

转到字符串中的每个空白。 C#

[英]Go to each white space in a string. C#

是否可以通过字符串,找到空白?

例如一个数据集:

string myString = "aa bbb cccc dd";

我该如何遍历并检测每个空白并操纵该空白?

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

谢谢。

更新:
我需要通过从整数值增加空白来操纵空间。 因此,例如将空间增加为3个空格,而不是1个。 我想让它在一个循环中遍历每个空白,.NET中已经有这样做的任何方法了吗? 空格表示“”。

您可以使用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简单得多,因此它至少应该同样快,并且代码也更简单。

如果要一键替换所有空格,可以执行以下操作:

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

根据您要执行的操作:

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

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

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

如果您需要对每种方法做一些不同的事情:

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

编辑:

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

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

myString = 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

使用string.Replace()

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

如果您想left/right justify您的字符串

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM