C# 像这样把句子分成小块

C# 像这样把句子分成小块,c#,.net,vb.net,string,split,C#,.net,Vb.net,String,Split,我需要拆分这段文字 这真的很酷,我喜欢 进入这个 this is really cool , and i like it . 你知道怎么做吗?用空格分开,给这个 this is really cool, and i like it. 我需要标点符号i作为数组的一个单独元素 谢谢您不能使用String.Split在“无”的情况下进行拆分 相反,您可以使用Regex.Split来执行此操作: Regex r = new Regex(@"[ ]|(?=[,.])"); string[] items

我需要拆分这段文字

这真的很酷,我喜欢

进入这个

this
is
really
cool
,
and
i
like
it
.
你知道怎么做吗?用空格分开,给这个

this
is
really
cool,
and
i
like
it.
我需要标点符号i作为数组的一个单独元素


谢谢

您不能使用String.Split在“无”的情况下进行拆分

相反,您可以使用
Regex.Split
来执行此操作:

Regex r = new Regex(@"[ ]|(?=[,.])");
string[] items = r.Split(input);

在这种模式中,我们要么匹配一个空格(它被“消耗”),要么前瞻标点符号(而不是“消耗”它)。

您不能使用String.Split在“无”的情况下进行拆分

相反,您可以使用
Regex.Split
来执行此操作:

Regex r = new Regex(@"[ ]|(?=[,.])");
string[] items = r.Split(input);

在这种模式中,我们要么匹配一个空格(它被“消耗”),要么前瞻标点符号(而不是“消耗”它)。

如果您只关心输出,而不太关心性能,为什么不这样做:

string[] splitSentence(string sentence) {
    return sentence
        .Replace(",", " , ")
        .Replace(".", " . ")
        .Split(' ', StringSplitOptions.RemoveEmptyEntries);
}

会有用的!:)当然,如果您真的关心性能,请参见Scott的答案。

如果您只关心输出,而不非常关心性能,为什么不这样做:

string[] splitSentence(string sentence) {
    return sentence
        .Replace(",", " , ")
        .Replace(".", " . ")
        .Split(' ', StringSplitOptions.RemoveEmptyEntries);
}

会有用的!:)当然,如果您真的关心性能,请参阅Scott的答案。

我可能会以老式的方式处理此问题,并简单地迭代每个字符。比如:

    static private IList<string> SplitString(string str)
    {
        List<string> lines = new List<string>();

        StringBuilder line = new StringBuilder();

        for(int i = 0; i < str.Length; ++i)
        {
            if (char.IsWhiteSpace(str[i]))
            {
                // split silently at whitespace
                if (line.Length > 0)
                    lines.Add(line.ToString());
                line.Clear();
            }
            else if (IsPunctuationCharacter(str[i]))
            {
                // split for punctuation and include each punctuation character as its own line
                if (line.Length > 0)
                    lines.Add(line.ToString());
                lines.Add(new string(new char[] { str[i] }));
                line.Clear();
            }
            else
            {
                // all other characters get added to the current line
                line.Append(str[i]);
            }
        }

        if (line.Length > 0)
            lines.Add(line.ToString());

        return lines;
    }

    static private bool IsPunctuationCharacter(char c)
    {
        if (c == ',' || c == '.' || c == '?' || c == '!')
            return true;
        else
            return false;
    }
静态私有IList拆分字符串(string str)
{
列表行=新列表();
StringBuilder行=新的StringBuilder();
对于(int i=0;i0)
添加(line.ToString());
line.Clear();
}
else if(ispuncationcharacter(str[i]))
{
//拆分为标点符号,并将每个标点符号字符包含为其自己的行
如果(直线长度>0)
添加(line.ToString());
Add(新字符串(新字符[]{str[i]}));
line.Clear();
}
其他的
{
//将所有其他字符添加到当前行
行。追加(str[i]);
}
}
如果(直线长度>0)
添加(line.ToString());
回流线;
}
静态私有bool ispuncationcharacter(字符c)
{
如果(c==','| | c=='。| | c=='?'| | c=='!')
返回true;
其他的
返回false;
}

我可能会以老式的方式处理这个问题,只需在每个字符上迭代。比如:

    static private IList<string> SplitString(string str)
    {
        List<string> lines = new List<string>();

        StringBuilder line = new StringBuilder();

        for(int i = 0; i < str.Length; ++i)
        {
            if (char.IsWhiteSpace(str[i]))
            {
                // split silently at whitespace
                if (line.Length > 0)
                    lines.Add(line.ToString());
                line.Clear();
            }
            else if (IsPunctuationCharacter(str[i]))
            {
                // split for punctuation and include each punctuation character as its own line
                if (line.Length > 0)
                    lines.Add(line.ToString());
                lines.Add(new string(new char[] { str[i] }));
                line.Clear();
            }
            else
            {
                // all other characters get added to the current line
                line.Append(str[i]);
            }
        }

        if (line.Length > 0)
            lines.Add(line.ToString());

        return lines;
    }

    static private bool IsPunctuationCharacter(char c)
    {
        if (c == ',' || c == '.' || c == '?' || c == '!')
            return true;
        else
            return false;
    }
静态私有IList拆分字符串(string str)
{
列表行=新列表();
StringBuilder行=新的StringBuilder();
对于(int i=0;i0)
添加(line.ToString());
line.Clear();
}
else if(ispuncationcharacter(str[i]))
{
//拆分为标点符号,并将每个标点符号字符包含为其自己的行
如果(直线长度>0)
添加(line.ToString());
Add(新字符串(新字符[]{str[i]}));
line.Clear();
}
其他的
{
//将所有其他字符添加到当前行
行。追加(str[i]);
}
}
如果(直线长度>0)
添加(line.ToString());
回流线;
}
静态私有bool ispuncationcharacter(字符c)
{
如果(c==','| | c=='。| | c=='?'| | c=='!')
返回true;
其他的
返回false;
}

如果“好的……这是史密斯先生的简历”,该怎么办?熟食店在这里吗。。?最简单的方法就是看一眼var x=“这真的很酷,我喜欢它。”;变量y=x。替换(“,”,”);然后对空格进行拆分,并将单词cool后面的空格替换为“,”,当然,您可以使用linq或for循环来检查和删除replace@MarkByers每个字母(在C.V.)和标点符号都将位于数组中的一个元素中。@DJKRAZE我在这里使用的分隔符是空格,但我不知道如果我用字符数组分割,输出会是什么,“好的……这是史密斯先生的简历”会发生什么?这里的熟食是“,”吗。。?最简单的方法就是看一眼var x=“这真的很酷,我喜欢它。”;变量y=x。替换(“,”,”);然后对空格进行拆分,并将单词cool后面的空格替换为“,”,当然,您可以使用linq或for循环来检查和删除replace@MarkByers每个字母(在C.V.)和标点符号都将位于数组中的一个元素中。@DJKRAZE我在这里使用的分隔符是空格,但我不知道如果我用字符数组分割,输出会使它保持简单。。。我同意。Regex有时提供“酷”的解决方案,但复杂性呈指数级增长。这是一个很好的解决方案。而且,正则表达式比简单的字符串操作需要更多的处理,所以我真的不能说哪种方法更快。同意,这当然是需要测试的。保持简单。。。我同意。Regex有时提供“酷”的解决方案,但复杂性呈指数级增长。这是一个很好的解决方案。而且,正则表达式比简单的字符串操作需要更多的处理,所以我真的说不出哪种方法更快。同意,这当然是应该测试的。非常感谢,您是否可以向我解释正则表达式模式?
@“[\s]|(?=\p{p})”
将其扩展到其他标点字符和空格以外的空格。非常感谢,您能向我解释一下正则表达式模式吗?
@“[\s]|(=