Kanwar Rafi
Kanwar Rafi

Reputation: 55

Split string pattern

I have a string that I need to split in an array of string. All the values are delimited by a pipe | and are separated by a comma.

|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||

The array should have the following 8 values after the split

111
2,2
room 1
13'2'' x 13'8''
""
""
""
""

by "" I simply mean an empty string. Please note that the value can also have a comma e.g 2,2. I think probably the best way to do this is through Regex.Split but I am not sure how to write the correct regular expression. Any suggestions or any better way of achieving this will be really appreciated.

Upvotes: 1

Views: 1227

Answers (6)

Ibrahim Najjar
Ibrahim Najjar

Reputation: 19423

You can use Match() to get the values instead of split() as long as the values between the pipe characters don't contain the pipe character itself:

(?<=\|)[^|]*(?=\|)

This will match zero or more non-pipe characters [^|]* which are preceded (?<=\|) and followed by a pipe (?=\|).

In C#:

var input = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var results = Regex.Matches(input, @"(?<=\|)[^|]*(?=\|)"); 
foreach (Match match in results)
     Console.WriteLine("Found '{0}' at position {1}", 
                       match.Value, match.Index);

EDIT: Since commas always separate the values that are between pipe characters | then we can be sure that the commas used as separators will always appear at odd intervals, so we can only walk the even indexes of the array to get the true values like this:

var input = "|room 1|,|,|,||,||,||,||,||,||";

var results = Regex.Matches(input, @"(?<=\|)[^|]*(?=\|)");

for (int i = 0; i < results.Count; i+=2)
    Console.WriteLine("Found '{0}'", results[i].Value);

This can be also used in the first example above.

Upvotes: 2

Dmytro
Dmytro

Reputation: 1600

Check, if this fits your needs...

var str = "|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";  
//Iterate through all your matches (we're looking for anything between | and |, non-greedy)                     
foreach (Match m in Regex.Matches(str, @"\|(.*?)\|"))
{
    //Groups[0] is entire match, with || symbols, but [1] - something between ()
    Console.WriteLine(m.Groups[1].Value);
}

Though, to find anything between | and |, you might and probably should use [^\|] instead of . character.

At least, for specified use case it gives the result you're expecting.

Upvotes: 0

Ben
Ben

Reputation: 1963

No need to use a regex, remove the pipes and split the string on the comma:

var input = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";

var parts = input.Split(',').Select(x => x.Replace("|", string.Empty));

or

var parts = input.Replace("|", string.Empty).Split(',');


EDIT: OK, in that case, use a while loop to parse the string:

var values = new List<string>();
var str = @"|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";;
while (str.Length > 0)
{
    var open = str.IndexOf('|');
    var close = str.IndexOf('|', open + 1);

    var value = str.Substring(open + 1, open + close - 1);
    values.Add(value);

    str = open + close < str.Length - 1 
            ? str.Substring(open + close + 2) 
            : string.Empty;
}

Upvotes: 1

Jeff
Jeff

Reputation: 918

Assuming all fields are enclosed by a pipe and delimited by a comma you can use |,| as the delimiter, removing the leading and trailing |

Dim data = "|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||"
Dim delim = New String() {"|,|"}
Dim results = data.Substring(1, data.Length - 2).Split(delim, StringSplitOptions.None)

For Each s In results
  Console.WriteLine(s)
Next

Output:

111
2,2
room 1
13'2'' x 13'8''
""
""
""
""

Upvotes: 1

kintaro
kintaro

Reputation: 2544

mmm maybe this work for you:

var data = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var resultArray = data.Replace("|", "").Split(',');

Regards.,

k

EDIT: You can use wildcard

string data = "|111|,|2,2|,|,3|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var resultArray = data.Replace("|,|", "¬").Replace("|", "").Split('¬');

Regards.,

k

Upvotes: 0

Aage
Aage

Reputation: 6252

You could try this:

 string a = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";

 string[] result = a.Split('|').Where(s => !s.Contains(",")).Select(s => s.Replace("|",String.Empty)).ToArray();

Upvotes: 0

Related Questions