C#空格替换某个字符串

时间:2018-01-31 22:55:10

标签: c# string replace

是否可以改变这一点:

w o r d 1   w o r d 2   w o r d 3   w o r d 4   

到此:

word1 word2 word3 word4

如果我尝试更换一个空格,它会删除每一个空间..

6 个答案:

答案 0 :(得分:1)

这有效:

var input = "w o r d 1   w o r d 2   w o r d 3   w o r d 4";
var output = String.Join("", input.Select((x, n) => new { x , n }).Where(xn => xn.n % 2 == 0).Select(xn => xn.x));

它给出了:

word1 word2 word3 word4

如果为" System.Interactive"添加NuGet包。然后你可以这样做:

var output = String.Join("", input.Buffer(2).Select(xs => xs[0]));

答案 1 :(得分:1)

由于单词之间有三个空格而不是两个空格,所以它比它可能有点棘手。

显而易见的答案是使用两个正则表达式替换。首先,用非空格替换非空格后跟空格,然后用空格替换一个或多个空格。

var ans1 = Regex.Replace(Regex.Replace(s, @"(\S)\s", "$1"), @"  +", " ");

也许有点模糊,你可以使用匹配评估器来替换没有空格的单个空格和单个空格的多个空格:

var ans2 = Regex.Replace(s, " +", m => m.Dump("m").Length == 1 ? "" : " ");

我最喜欢和完全不切实际的答案是使用APL习语进行多个空间压缩,此处经过修改以处理字母之间的单个空格并基于IEnumerable<bool>

首先,您需要一些扩展方法来模拟布尔向量上的APL运算符:

public static IEnumerable<bool> And(this IEnumerable<bool> a, IEnumerable<bool> b) => a.Zip(b, (ab, bb) => ab && bb);
public static IEnumerable<bool> Or(this IEnumerable<bool> a, IEnumerable<bool> b) => a.Zip(b, (ab, bb) => ab || bb);
public static IEnumerable<bool> Not(this IEnumerable<bool> a) => a.Select(b => !b);

public static IEnumerable<T> Leave<T>(this ICollection<T> src, int drop) => src.Take(src.Count - drop);

public static IEnumerable<T> Leave<T>(this IEnumerable<T> src, int drop) {
    var esrc = src.GetEnumerator();
    var buf = new Queue<T>();
    while (drop-- > 0)
        if (esrc.MoveNext())
            buf.Enqueue(esrc.Current);
        else
            break;

    while (esrc.MoveNext()) {
        buf.Enqueue(esrc.Current);
        yield return buf.Dequeue();
    }
}

public static IEnumerable<T> Rotate<T>(this IEnumerable<T> src, int num) {
    if (num > 0) {
        var esrc = src.GetEnumerator();
        var q = new Queue<T>();

        while (esrc.MoveNext() && num-- > 0)
            q.Enqueue(esrc.Current);

        while (esrc.MoveNext())
            yield return esrc.Current;

        while (q.Count > 0)
            yield return q.Dequeue();
    }
}

public static IEnumerable<T> RightShift<T>(this IEnumerable<T> src, int num) {
    var lead = num;
    while (lead-- > 0)
        yield return default(T);

    foreach (var s in src.Leave(num))
        yield return s;
}

public static IEnumerable<T> LeftShift<T>(this IEnumerable<T> src, int num) {
    foreach (var s in src.Skip(num))
        yield return s;

    while (num-- > 0)
        yield return default(T);

}

public static IEnumerable<T> Compress<T>(this IEnumerable<bool> bv, IEnumerable<T> src) {
    var srce = src.GetEnumerator();
    foreach (var b in bv) {
        srce.MoveNext();
        if (b)
            yield return srce.Current;
    }
}

然后你就在空格字符为true的布尔向量上做一些布尔代数:

var bvIsSpace = s.Select(ch => ch == ' ');
var bvIsNotSpace = bvIsSpace.Not();
var boolVectorInclude = bvIsNotSpace.Or(bvIsSpace.And(bvIsNotSpace.RightShift(1)).And(bvIsSpace.RightShift(1).Or(bvIsSpace.LeftShift(1))));

var ans = new String(boolVectorInclude.Compress(s).ToArray());

答案 2 :(得分:0)

常规爆炸和普通字符串替换的组合将执行:

using System;
using System.Text.RegularExpressions;

public class Program
{
    public static void Main(string[] args)
    {
        var s = "w o r d 1   w o r d 2   w o r d 3   w o r d 4  ";

        Regex re = new Regex("( (?! ))");
        s = re.Replace(s, "").Replace("  ", " ");
        Console.WriteLine(s);
        Console.ReadLine();
    }
}

正则表达式( (?! ))表示“未被其他空格跟踪的空格”(负面向前看),由""替换,然后将" "正常替换为" "

输出:

word1 word2 word3 word4

答案 3 :(得分:0)

另一种方法是分三步完成。

  1. 在双空格上拆分字符串
  2. 在每个拆分字符串中,删除空格
  3. 将所有部分与单个空格连接在一起
  4. 如果这是一个性能关键的操作,我不会使用这种方法,因为涉及大量的内存流失。

答案 4 :(得分:0)

如果你的目标是获得想要的输出,你也可以使用remove方法代替replace

     string a = "w o r d 1   w o r d 2   w o r d 3   w o r d 4 ";
                for(int i=0;i<a.Length;i++)
                {
                    if (a[i] == ' ')
                       a = a.Remove(i, 1);
                }

                Console.WriteLine(a);

只需循环播放字符串,然后按指定的索引删除 1 字符。

otuput:word1 word2 word3 word4

答案 5 :(得分:0)

将所有非空格字符写入新字符串,并仅写入此空格,其旁边有空格。

var w = "w o r d 1   w o r d 2   w o r d 3   w o r d 4";
var n = string.Empty;

for (var i = 0; i < w.Length; i++) 
{
    if (w[i] == ' ' && i+1 < w.Length && w[i+1] != ' ')
    { 
        n += ""; 
    }
    else 
    {
        n += w[i];
    }
}