3

我有一个字符串需要转换成String[]字符串中每个单词的一个。但是,除了属于单词的连字符和撇号外,我不需要任何空格或任何标点符号。

示例输入:

Hello! This is a test and it's a short-er 1. - [ ] { } ___)

由输入组成的数组示例:

[ "Hello", "this", "is", "a", "test", "and", "it's", "a", "short-er", "1" ]

目前这是我尝试过的代码

(注意:第二个在程序中稍后string.First()调用时会出错):

private string[] ConvertWordsFromFile(String NewFileText)
{
     char[] delimiterChars = { ' ', ',', '.', ':', '/', '|', '<', '>', '/', '@', '#', '$', '%', '^', '&', '*', '"', '(', ')', ';' };
     string[] words = NewFileText.Split(delimiterChars, StringSplitOptions.RemoveEmptyEntries);
     return words;
}

或者

private string[] ConvertWordsFromFile(String NewFileText)
{     
    return Regex.Split(NewFileText, @"\W+");
}

第二个示例使用以下代码崩溃

private string GroupWordsByFirstLetter(List<String> words)
{
    var groups =
        from w in words
        group w by w.First();
    return FormatGroupsByAlphabet(groups);
}

具体来说,何时w.First()被调用。

4

4 回答 4

4

从字符串中删除不需要的字符

string randomString = "thi$ is h@ving s*me inva!id ch@rs";
string excpList ="$@*!";

LINQ 选项 1

var chRemoved = randomString
                  .Select(ch => excpList.Contains(ch) ? (char?)null : ch);

var Result = string.Concat(chRemoved.ToArray());    

LINQ 选项 2

var Result = randomString.Split().Select(x => x.Except(excList.ToArray()))
                                      .Select(c => new string(c.ToArray()))
                                      .ToArray();
于 2012-11-12T03:06:32.167 回答
1

这是我处理的一些事情。拆分\n并删除任何不需要的字符。

    private string ValidChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789'-";
    private IEnumerable<string> SplitRemoveInvalid(string input)
    {
        string tmp = "";
        foreach(char c in input)
        {
            if(c == '\n')
            {
                if(!String.IsNullOrEmpty(tmp))
                {
                    yield return tmp;
                    tmp = "";
                }
                continue;
            }
            if(ValidChars.Contains(c))
            {
                tmp += tmp;
            }
        }
        if (!String.IsNullOrEmpty(tmp)) yield return tmp;
    }

用法可能是这样的:

    string[] array = SplitRemoveInvalid("Hello! This is a test and it's a short-er 1. - [ ] { } _)")
                     .ToArray();

我实际上没有测试它,但它应该可以工作。如果没有,它应该很容易修复。

于 2012-11-12T03:02:25.357 回答
0

使用string.Split(char [])

string strings = "4,6,8\n9,4";
string [] split = strings .Split(new Char [] {',' , '\n' });

或者

如果您收到任何不需要的空物品,请尝试以下操作。String.Split 方法 (String[], StringSplitOptions)

string [] split = strings .Split(new Char [] {',' , '\n' }, 
                                 StringSplitOptions.RemoveEmptyEntries);
于 2012-11-12T02:53:57.490 回答
0

这可以很容易地用正则表达式通过匹配单词来完成。我正在使用以下正则表达式,它允许在单词中间使用连字符和撇号,但如果它们出现在单词边界,则会将它们删除。

\w(?:[\w'-]*\w)?

在这里查看它的实际应用。

在 C# 中,它可能看起来像这样:

private string[] ConvertWordsFromFile(String NewFileText)
{
     return (from m in new Regex(@"\w(?:[\w'-]*\w)?").Matches(NewFileText)
             select m.Value).ToArray();
}

我正在使用 LINQ 从MatchCollection返回的Matches.

于 2015-05-31T22:01:52.793 回答