从字符串中删除指定的标点符号

时间:2012-11-12 02:45:00

标签: c# regex string

我有一个字符串需要转换为字符串中每个单词的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()时,第2个程序会在程序中出现错误):

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 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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();

我没有真正测试它,但它应该工作。如果它没有,它应该很容易修复。

答案 2 :(得分:0)

使用string.Split(char [])

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

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

string [] split = strings .Split(new Char [] {',' , '\n' }, 
                                 StringSplitOptions.RemoveEmptyEntries);

答案 3 :(得分:0)

通过匹配单词,可以通过RegEx轻松完成。我正在使用以下RegEx,它将允许在单词中间使用连字符和撇号,但如果它们出现在单词边界,则会将它们删除。

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

在行动here中查看。

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

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

我正在使用LINQ从MatchCollection返回的Matches中获取一系列字词。