I've been using the Split()
method to split strings, but this only appears to work if you are splitting a string by a character. Is there a way to split a string
, with another string being the split by parameter?
I've tried converting the splitter into a character array, with no luck.
In other words, I'd like to split the string
:
THExxQUICKxxBROWNxxFOX
by xx
, and return an array with values:
THE, QUICK, BROWN, FOX
In order to split by a string you'll have to use the string array overload.
string data = "THExxQUICKxxBROWNxxFOX";
return data.Split(new string[] { "xx" }, StringSplitOptions.None);
edit: See @Danation's answer for newer/less versbose overload
There is an overload of Split that takes strings.
"THExxQUICKxxBROWNxxFOX".Split(new [] { "xx" }, StringSplitOptions.None);
You can use either of these StringSplitOptions
None - The return value includes array elements that contain an empty string
RemoveEmptyEntries - The return value does not include array elements that contain an empty string
So if the string is "THExxQUICKxxxxBROWNxxFOX", StringSplitOptions.None
will return an empty entry in the array for the "xxxx" part while StringSplitOptions.RemoveEmptyEntries
will not.
Split(String[], StringSplitOptions)
Regex.Split(string, "xx")
is the way I do it usually.
Of course you'll need:
using System.Text.RegularExpressions;
or :
System.Text.RegularExpressions.Regex.Split(string, "xx")
but then again I need that library all the time.
RegEx.Split
is quite a bit more costly than a simple String.Split
because of the regular expression overhead.
Regex.Escape
on the string first, this will escape any regex meta-characters.
There's an overload of String.Split for this:
"THExxQUICKxxBROWNxxFOX".Split(new [] {"xx"}, StringSplitOptions.None);
I generally like to use my own extension for that:
string data = "THExxQUICKxxBROWNxxFOX";
var dataspt = data.Split("xx");
//>THE QUICK BROWN FOX
//the extension class must be declared as static
public static class StringExtension
{
public static string[] Split(this string str, string splitter)
{
return str.Split(new[] { splitter }, StringSplitOptions.None);
}
}
This will however lead to an Exception, if Microsoft decides to include this method-overload in later versions. It is also the likely reason why Microsoft has not included this method in the meantime: At least one company I worked for, used such an extension in all their C# projects.
It may also be possible to conditionally define the method at runtime if it doesn't exist.
params string[] splitter
as the second parameter and change new[] {splitter}
to splitter
to support multiple delimiters.
As of .NET Core 2.0, there is an override that takes a string.
So now you can do "THExxQUICKxxBROWNxxFOX".Split("xx")
.
The previous answers are all correct. I go one step further and make C# work for me by defining an extension method on String:
public static class Extensions
{
public static string[] Split(this string toSplit, string splitOn) {
return toSplit.Split(new string[] { splitOn }, StringSplitOptions.None);
}
}
That way I can call it on any string in the simple way I naively expected the first time I tried to accomplish this:
"a big long string with stuff to split on".Split("g str");
string data = "THExxQUICKxxBROWNxxFOX";
return data.Replace("xx","|").Split('|');
Just choose the replace character carefully (choose one that isn't likely to be present in the string already)!
|
char already, for this reason I think it's dangerous to use.
Create this function first.
string[] xSplit(string str, string sep) {
return str.Split(new [] {sep}, StringSplitOptions.None);
}
Then use it like this.
xSplit("THExxQUICKxxBROWNxxFOX", "xx");
This is also easy:
string data = "THExxQUICKxxBROWNxxFOX";
string[] arr = data.Split("xx".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
"THExQUICK"
where we do not want it to be splitted
The easiest way is to use String.Replace
:
string myString = "THExxQUICKxxBROWNxxFOX";
mystring = mystring.Replace("xx", ", ");
Or more simply:
string myString = "THExxQUICKxxBROWNxxFOX".Replace("xx", ", ");
xx
's were.
Success story sharing
string.Split
.string[] Split(string pattern)
, which is the most natural usage I could think of yet it isn't there. I wrote C before so I am used to char arrays but I still hate to seechar[]
popping up in a C# code because it suddenly drags my attention from stream level to byte level. Anybody know why C# library guys designed the Split method like this? If there is a good reason, I can probably try to appreciate it despite the inconvenience.data.Split("xx")
?