DSS
DSS

Reputation: 53

Extract tokens from the string C# regex

I got string which needs to be separated by pipe |.

The numeric tokens can be defined without wrapping in anything like 20 and 50 in the example below or could be defined in [] or {}.

The string token will be either wrapped in [] or {} and can have any special characters including | separator within the token. They cannot have [] or {} within the token string.

[Name1]|20|[Nam|2]|{Na;me,3}|50|[Na|me!@#$%^&*()Finish]|[25]|{67}

Need to extract above string to following tokens:

Name1

20

Name|2

Na;me,3

50

Na|me!@#$%^&*()Finish

25

67

How can we do that in C#? Is regular expressions best way to go about it?

Upvotes: 1

Views: 467

Answers (1)

Wiktor Stribiżew
Wiktor Stribiżew

Reputation: 626774

You can extract them with

\[(?<r>[^][]*)]|\{(?<r>[^{}]*)}|(?<r>[^|]+)

See the regex demo. Details:

  • \[(?<r>[^][]*)] - [, then any zero or more chars other than [ and ] captured into Group "r", and then a ] char
  • | - or
  • \{(?<r>[^{}]*)} - {, then any zero or more chars other than { and } captured into Group "r", and then a } char
  • | - or
  • (?<r>[^|]+) - any one or more chars other than a | char captured in Group "r".

See the C# demo:

var text = "[Name1]|20|[Nam|2]|{Na;me,3}|50|[Na|me!@#$%^&*()Finish]|[25]|{67}";
var pattern = @"\[(?<r>[^][]*)]|\{(?<r>[^{}]*)}|(?<r>[^|]+)";
var result = Regex.Matches(text, pattern).Cast<Match>().Select(x => x.Groups["r"].Value);
foreach (var s in result)
    Console.WriteLine(s);

Output:

Name1
20
Nam|2
Na;me,3
50
Na|me!@#$%^&*()Finish
25
67

Upvotes: 2

Related Questions