[英]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.