是否可以改变这一点:
w o r d 1 w o r d 2 w o r d 3 w o r d 4
到此:
word1 word2 word3 word4
如果我尝试更换一个空格,它会删除每一个空间..
答案 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)
另一种方法是分三步完成。
如果这是一个性能关键的操作,我不会使用这种方法,因为涉及大量的内存流失。
答案 4 :(得分:0)
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];
}
}