从字符串中删除字符和空格

时间:2019-01-31 05:11:01

标签: c#

我正在尝试从一个字符串中删除所有出现在另一个字符串上的字符。理想情况下,生成的字符串不会包含两个相邻的空格,至少删除的字符一定不能替换为空格(或其他任何不可见的字符)。

我想出以下的代码,但某种的空间的留下,如果我这样做(除了具有代替多个顺序空间 "jest": { "moduleDirectories": [ "node_modules", "src" ], "moduleFileExtensions": [ "js", "json", "ts" ], "roots": [ "src" ], "testRegex": ".spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" }, "coverageDirectory": "../coverage", "testEnvironment": "node", "moduleNameMapper": { "src/(.*)": "<rootDir>/src/$1" } } )。也有删除方法,但是它需要索引,因此会使解决方案复杂化。

" a "

输出:

enter image description here

预期输出:

  

这是第一次发送

我使用'\ 0'的原因是String s1="aeiou"; String s2="This is a test string which could be any text"; Console.WriteLine(s2); for (int i=0; i<s1.Length; i++) { if(s2.Contains(s1[i])) { s2= s2.Replace(s1[i],'\0'); } } Console.WriteLine(s2); 仅期望字符,并且对于第二个参数为string.Replace()的版本,第一个参数也必须为字符串(这需要转换-显示为“变体1”稍后)。

我已经从这些相关/建议的重复帖子(Remove characters from C# stringRemove '\' char from string c#)中获得了参考,但没有找到完全令我满意的方法。

变体1 (基于获得最多投票的answer。此版本需要将我要替换的每个字符转换为我不喜欢的字符串:

string.Empty

变体2 -String s1="aeiou"; String s2="This is a test string which could be any text"; Console.WriteLine(s2); foreach(var c in s1) { s2 = s2.Replace(c.ToString(), string.Empty); } Console.WriteLine(s2); String.Joinanswer)。希望避免这种情况时,需要将源替换字符串转换为数组。

String.Split

变体3 -String s1="aeiou"; String s2="This is a test string which could be any text"; s2 = String.Join("", s2.Split(s1.ToCharArray())); answer)-这比变体2还要复杂,因为我需要将替换字符串转换为正确的正则表达式,可能完全是断掉Regex.Replace之类的字符串来替换(在这种情况下也不需要):

"^!"

变体4 使用Linq从结果字符数组构造字符串(answer需要在构造字符串之前将结果序列转换为数组(理想情况下应避免):

String s1="aeiou";
String s2="This is a test string which could be any text";

s2 = Regex.Replace(s2, "["+s1+"]", String.Empty);
Console.WriteLine(s2);

变体5 -使用到目前为止看起来最好的String s1="aeiou"; String s2="This is a test string which could be any text"; s2 = new string(s2.Where(c => !s1.Contains(c)).ToArray()); Console.WriteLine(s2); answer),但使用Linq(我不愿意...也许也没有充分的理由)要在这里使用Linq)

String.Concat

我没有提出remove duplicate spaces的解决方案,所有X版本都确实删除了字符,但是对于我的情况有一些问题。理想的答案也不会造成太多额外的字符串,没有LINQ和没有额外的转换到数组。

2 个答案:

答案 0 :(得分:3)

假设要排除在一个字符串中字符,事后用一个空格取代多个空格,就可以在2个步骤使用regex容易

string input = "This is a test string which could be any text";
string exclude = "aeiou";

var stripped = Regex.Replace(input, $"[{exclude}]", ""); // exclude chars
var cleaned = Regex.Replace(stripped, "[ ]{2,}", " "); // replace multiple spaces

Console.WriteLine(stripped);
Console.WriteLine(cleaned);

输出

Ths s  tst strng whch cld b ny txt
Ths s tst strng whch cld b ny txt

Full Demo Here

注意:如果你的字符串中可以包含字符需要在正则表达式使用转义Regex.Escape如以下的answer - $"[{Regex.Escape(exclude)}]"

答案 1 :(得分:1)

在您遇到的情况下,使用StringBuilders2构建结果:

String s1 = "aeiou";
String s2 = "This is a test string which could be any text";

StringBuilder sb = new StringBuilder();

for (int i = 0; i < s2.Length; i++)
{
    // Check if current char is not contained in s1,
    // then add it to sb
    if (!s1.Contains(s2[i]))
    {
        sb.Append(s2[i]);
    }
}

string result = sb.ToString();

编辑:

要从字符串中删除空格,您可以执行以下操作:

string result = string.Join(" ", sb.ToString().Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));

输出:

  

这是第一次发送

此外,这是LINQ解决方案:

var result = string.Concat(s2.Where(c => !s1.Contains(c)));

同样,如果要删除单词之间的空格(可以为此创建扩展方法):

var raw = string.Concat(s2.Where(c => !s1.Contains(c)));
var result = string.Join(" ", raw.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries));

参考:Enumerable.Where MethodString.Contains MethodString.Concat Method