转到字符串中的每个空格.C#.
本文关键字:空格 字符串 | 更新日期: 2023-09-27 18:28:44
是否可以传递字符串,找到空格?
例如,以下数据集:
string myString = "aa bbb cccc dd";
如何遍历和检测每个空白区域,并操纵该空格?
我需要以最有效的方式做到这一点。
谢谢。
更新:
我需要通过从整数值增加空格来操作空格。因此,例如,将空间增加到 3 个空格而不是一个。我想让它在一个循环中穿过每个空格,有什么方法已经在 .NET 中做到这一点吗?我所说的空格是指" '。
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)));