You have to change the regex and you have to iterate until all nested '{}' groups are processed.
The regex expression needs to be:
"{([^{}]+)}"<br />
. This matches any expression that begins with '{' but does not contain either '{' or '}' - ensuring that it exactly matches one of your options groups.
You need to feed the output result string back into the regex replace, iteratively, until it no longer changes. Each time you do the replace, spans of '{...}' gets replaced by one of its options, leaving their containing '{...}' spans 'visible' to the next replace attempt (they are now visible because there is no longer a '{' or '}' nestled within).
Here's my test app (note - I've hard-coded the selected option; you'll need to change it):
Public Shared Sub RunTest()
Dim re As New Regex("{([^{}]+)}")
Dim result As String = "{My name is James Vick and I am a {member|user|visitor} on this {forum|website|site} and I am loving it | I am admin and I am a {supervisor|admin|moderator} on this {forum|website|site} and I am loving it}"
Do While result.Contains("{")
result = re.Replace(result, New MatchEvaluator(AddressOf RegexTest.ReplaceMatch))
Loop
Console.WriteLine(result)
Console.Write("Press any key to exit: ")
Console.ReadKey
End Sub
Private Shared Function ReplaceMatch(ByVal m As Match) As String
Return m.Groups.Item(1).Value.Split(New Char() { "|"c })(0)
End Function
Note - instead of tracking 'did the string change' I'm just testing to see if it still contains a '{'. It's good enough for a test app, but may not be safe enough for your app.