Home > Software design >  How to separate string after whitespace in c#
How to separate string after whitespace in c#

Time:07-28

I'm using c# and have a string like x="12 $Math A Level$"` that could be also x="12 Math A Level"

How can I separate this string in order to have a variable year=12 and subject=Math A Level?

I was using something like:

char[] whitespace = new char[] { ' ', '\t' };
var x = item.Split(whitespace);

but then I didn't know what to do after or if there's a better way to do this.

CodePudding user response:

You could use the override of split that takes the count :

var examples = new []{"2 $Math A Level$", "<some_num> <some text>"} ;

foreach(var s in examples)
{


var parts = s.Split(' ', count: 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);

Console.WriteLine($"'{parts[0]}', '{parts[1]}'");
}

This prints:

'2', '$Math A Level$'
'<some_num>', '<some text>'

CodePudding user response:

You could do

var item = "12 Math A Level";
var index = item.IndexOf(' ');
var year = item.Substring(0, index);
var subject = item.Substring(index   1, item.Length - index-1).Trim('$');

This assumes that the year is the first word, and the subject is everything else. It also assumes you are not interested in any '$' signs. You might also want to add a check that the index was actually found, in case there are no spaces in the string.

CodePudding user response:

To add a Regex-based answer:

using System;
using System.Text.RegularExpressions;
                    
public class Program
{
    
    public static readonly Regex regex = new Regex(@"(?<ID>[0-9] )\s [$]?(?<Text>[^$]*)[$]?", RegexOptions.Compiled);
    public static void Main()
    {
        MatchCollection matches = regex.Matches("12 $Math A Level$");
        
        foreach( Match m in matches )
        {
            Console.WriteLine($"{(m.Groups["ID"].Value)} | {(m.Groups["Text"].Value)}");
        }
        
        matches = regex.Matches("13 Math B Level");
        
        foreach( Match m in matches )
        {
            Console.WriteLine($"{(m.Groups["ID"].Value)} | {(m.Groups["Text"].Value)}");
        }
    }
}

In action: https://dotnetfiddle.net/6XEQw8

Output:

12 | Math A Level
13 | Math B Level

To explain the expression:

(?[0-9] )\s [$]?(?[^$]*)[$]?
(?[0-9] )  - Named Catpure-Group "ID"
      [0-9]    - Match literal chars '0' to '9'
               - ^^ One or more times
\s             - Match whitespace one or more times
[$]?           - Match literal '$' one or zero times
(?[^$]*) - Named Capture-Group "Text"
        [^$]   - Match anything that is _not_ literal '$'
            *  - ^^ Zero or more times
[$]?           - Match literal '$' one or zero times

See also https://regex101.com/r/WV366l/1


Mind: I personally would benchmark this solution against a (or several) non-regex solutions and then make a choice.

CodePudding user response:

var x = "12 $Math A Level$".Split('$', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);

string year = x[0];
string subject = x[1];

Console.WriteLine(year);
Console.WriteLine(subject);

CodePudding user response:

If you can rely on the string format specified ("12 $Math A Level$"), you could split with at $ like this:

using System;
                    
public class Program
{
    public static void Main()
    {
        var sample = "12 $Math A Level$";
        var rec = Parse(sample);
                
        Console.WriteLine($"Year={rec.Year}\nSubject={rec.Subject}");
    }
    
    private static Record Parse(string value)
    {
        var delimiter = new char[] { '$' };
        var parts = value.Split(delimiter, StringSplitOptions.RemoveEmptyEntries);
        return new Record { Year = Convert.ToInt32(parts[0]), Subject = parts[1] };
    }
    
    public class Record
    {
        public int Year { get; set; }
        public string Subject { get; set; }
    }
}
Output:
Year=12
Subject=Math A Level

▶️ Try it out here: https://dotnetfiddle.net/DAFLjA

  • Related