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

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()时。

1
你的实际问题是什么? - Enigmativity
如何删除除连字符和撇号之外的所有标点符号,这些符号在单词中间(并且属于该位置)? - James Thompson
在詹姆斯的问题中,如何确定撇号是否“合法”? - avishayp
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();

但是它并不返回一个字符串数组。我该如何将其转换为字符串数组?另外,我不太熟悉linq,但我更喜欢使用它。 - James Thompson
这段代码也会导致类似于第二个例子的错误。我将把冲突的代码添加到问题中。 - James Thompson
你不应该在查询中使用“first”。大多数情况下,你的结果中可能有或可能没有元素。 - Prabhu Murthy
@james,我简直不敢相信我把“group”读成了“sort”。我得去睡觉了,请检查我的编辑。 - Prabhu Murthy
这仍然不完全正确,但我相信这是比我之前的代码更好的。感谢您的所有帮助。 - James Thompson
显示剩余3条评论

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();

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


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从Matches返回的MatchCollection中获取一个单词数组。


0

这并不是 OP 想要的。 - caesay

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