C#中的字符串清理

3
我将尝试编写一个函数,它的输入是包含单词的字符串,并删除所有单个字符的单词。然后返回新字符串,但不包括被删除的字符。

例如:
string news = FunctionName("This is a test");
//'news' here should be "This is test".

Can you please help?


3
如果你需要大量字符串处理,请避免使用正则表达式。它非常慢。我会选择非正则表达式的解决方案作为更好的答案。 - NT_
你可以将其实现为字符串的扩展方法,以使其更易于阅读。 - Peter
5个回答

6

必备的LINQ一行代码:

string.Join(" ", "This is a test".Split(' ').Where(x => x.Length != 1).ToArray())

或者,作为一个更好的扩展方法:

void Main()
{
    var output = "This is a test".WithoutSingleCharacterWords();
}

public static class StringExtensions
{
    public static string WithoutSingleCharacterWords(this string input)
    {
        var longerWords = input.Split(' ').Where(x => x.Length != 1).ToArray();
        return string.Join(" ", longerWords);
    }
}

+1 喜欢使用扩展方法,它比我的示例更加简洁。我必须好好学习 LINQ。 - djdd87
如果单词之间有不同的空格怎么办? - Grzenio
@Grzenio 如果你想捕获制表符和换行符,你可以使用Regex.Split(input, @"\s")。我只是通过问题中的测试用例而已 :) - Martin Harris

3

我相信使用正则表达式会有更好的答案,但你可以按照以下步骤进行:

string[] words = news.Split(' ');

StringBuilder builder = new StringBuilder();
foreach (string word in words)
{
    if (word.Length > 1)
    {
       if (builder.ToString().Length ==0)
       {
           builder.Append(word);
       }
       else
       {
           builder.Append(" " + word);
       }
    }
}

string result = builder.ToString();

2

这个问题有趣的地方在于,您很可能还想删除围绕单字母单词的一个空格。

    string[] oldText = {"This is a test", "a test", "test a"};
    foreach (string s in oldText) {

        string newText = Regex.Replace(s, @"\s\w\b|\b\w\s", string.Empty);
        WL("'" + s + "' --> '" + newText + "'");
    }

输出...

'This is a test' --> 'This is test'
'a test' --> 'test'
'test a' --> 'test'

我刚刚碰到了那个问题。然后我开始考虑以单个字符开头和结尾的字符串,我的脑袋开始疼了 :) - MPritchard
至少,将正则表达式的实例化移出循环以提高性能。 ;) - Peter Lillevold
编码清晰易懂,优化留给读者练习 😉 - Ed Guiness

0

使用 Linq 语法,您可以做如下操作

return string.Join(' ', from string word in input.Split(' ') where word.Length > 1))

0
string str = "This is a test.";
var result = str.Split(' ').Where(s => s.Length > 1).Aggregate((s, next) => s + " " + next);

更新

使用扩展方法:

public static string RemoveSingleChars(this string str)
{
      return str.Split(' ').Where(s => s.Length > 1).Aggregate((s, next) => s + " " + next);       
}


//----------Usage----------//


var str = "This is a test.";
var result = str.RemoveSingleChars();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接