如何在C#中使用多字符定界符分割字符串?


232

如果我想使用一个单词的定界符分割一个字符串怎么办?

例如,This is a sentence

我想分裂is并得到Thisa sentence

在中Java,我可以发送字符串作为定界符,但是如何在其中完成C#呢?

Answers:


281

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

来自文档的示例:

string source = "[stop]ONE[stop][stop]TWO[stop][stop][stop]THREE[stop][stop]";
string[] stringSeparators = new string[] {"[stop]"};
string[] result;

// ...
result = source.Split(stringSeparators, StringSplitOptions.None);

foreach (string s in result)
{
    Console.Write("'{0}' ", String.IsNullOrEmpty(s) ? "<>" : s);
}

7
这实际上返回:'Th''''a句子'以及问题中给出的示例。也许这就是他真正想要的,但这不是他指定的。
IRBMe

6
这只是一个示例……重点是:有一个String.Split,它以字符串作为分隔符。
bruno conde

1
是的,但是它不执行问题所指定的内容。您必须使用一些更聪明的方法来指定输出。现在,指定的问题实际上是提问者真正想要的是另一个问题,但是仅使用String.Split无法简单地回答此处提出的问题。
IRBMe

3
仍然不能正常工作。如果在要拆分的单词中包含空格,则输出中将不包含空格。如果查看问题中给出的示例,您会注意到它们实际上确实包含空格。在“ is”上分割会给您“ This”和“一个句子”,而不是“ This”和“一个句子”。注意“ This”结尾和“ a句子”开头的细微空格。同样,此答案可能是发问者的真正想要的,但不是他所要的,我再说一遍,String.Split不会轻易解决它。
IRBMe

2
@IRBMe您阅读问题了吗?'我想分裂“是”。所以我会得到“ This”和“ a句子”。看到结果中的空格???这正是Split所做的。
bruno conde

55

您可以使用Regex.Split方法,如下所示:

Regex regex = new Regex(@"\bis\b");
string[] substrings = regex.Split("This is a sentence");

foreach (string match in substrings)
{
   Console.WriteLine("'{0}'", match);
}

编辑:这满足您提供的示例。请注意,一个普通的String.Split也会在单词“ This”的末尾对“ is ”进行拆分,因此,为什么我使用Regex方法并在单词“ is ” 周围包含单词边界。但是请注意,如果您只是错误地编写了此示例,则String.Split可能就足够了。


@编辑:我也不确定,但是如果他的目标是仅删除“是”一词,则仍然可以使用常规的字符串拆分,仅在两侧填充空格。
小贩

1
这也不起作用(至少没有付出更多的努力),因为在不知道空格在字符串中分割的位置的情况下,您不知道空格应该在左边,右边还是在右边。
IRBMe

似乎String.Splity允许您拆分一个已经很复杂的字符串……
Ed S.

3
我已经在我对答案的编辑中,上面的评论中以及对另一个答案的3条评论中解决了此问题。String.Split不适用于问题中提供的示例。我不会再通过解释原因来重复自己。如果您想知道,可以阅读所有其他评论。
IRBMe

请注意,正则表达式拆分方法不会删除变量上的预定界符和尾随定界符... :(
melaos 2011年

34

根据此职位的现有回复,此操作可以简化实现:)

namespace System
{
    public static class BaseTypesExtensions
    {
        /// <summary>
        /// Just a simple wrapper to simplify the process of splitting a string using another string as a separator
        /// </summary>
        /// <param name="s"></param>
        /// <param name="pattern"></param>
        /// <returns></returns>
        public static string[] Split(this string s, string separator)
        {
            return s.Split(new string[] { separator }, StringSplitOptions.None);
        }


    }
}

9
+1,这是对扩展方法的尖叫。几乎傻傻的是这不是内置的重载之一。
Todd Menier

9
@ToddMenier您几乎是什么意思?
mwardm 2014年

28
string s = "This is a sentence.";
string[] res = s.Split(new string[]{ " is " }, StringSplitOptions.None);

for(int i=0; i<res.length; i++)
    Console.Write(res[i]);

编辑:“ is”在数组的两边都用空格填充,以保留以下事实:您希望从句子中删除单词“ is”,而单词“ this”则保持不变。


8

...简而言之:

string[] arr = "This is a sentence".Split(new string[] { "is" }, StringSplitOptions.None);

5

您可以使用String.Replace()将所需的拆分字符串替换为字符串中不存在的字符,然后对该字符使用String.Split拆分结果字符串以达到相同的效果。


5

或使用此代码;(相同:new String [])

.Split(new[] { "Test Test" }, StringSplitOptions.None)

3

这是使用字符串分隔符进行拆分的扩展功能:

public static string[] Split(this string value, string seperator)
{
    return value.Split(new string[] { seperator }, StringSplitOptions.None);
}

用法示例:

string mystring = "one[split on me]two[split on me]three[split on me]four";
var splitStrings = mystring.Split("[split on me]");

0
var dict = File.ReadLines("test.txt")
               .Where(line => !string.IsNullOrWhitespace(line))
               .Select(line => line.Split(new char[] { '=' }, 2, 0))
               .ToDictionary(parts => parts[0], parts => parts[1]);


or 

    enter code here

line="to=xxx@gmail.com=yyy@yahoo.co.in";
string[] tokens = line.Split(new char[] { '=' }, 2, 0);

ans:
tokens[0]=to
token[1]=xxx@gmail.com=yyy@yahoo.co.in

-5
string strData = "This is much easier"
int intDelimiterIndx = strData.IndexOf("is");
int intDelimiterLength = "is".Length;
str1 = strData.Substring(0, intDelimiterIndx);
str2 = strData.Substring(intDelimiterIndx + intDelimiterLength, strData.Length - (intDelimiterIndx + intDelimiterLength));

19
在发布代码之前,您可能应该首先尝试通过编译器运行它,除非您表示自己没有这样做。第一行中缺少分号,并且未定义str1和str2。更不用说代码实际上不符合OP的要求。此代码将其分为“ Th”和“更容易”。
mandreko 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.