如何用多个分隔符拆分字符串?

How to split string with multiple separator?

假设我有一个包含以下内容的字符串:

string mystr = "*myid*-myemail-:mypwd:*myid2*-myemail2-:mypwd2:*myid3*-myemail3-:mypwd3:";

并且我想获取每个具有“*”的子字符串,然后将它们添加到一个新字符串中,然后获取每个具有“:”的值与具有“-”的值相同, 所以我尝试使用 split 方法,但它不起作用。

string mystr = "*myid*-myemail-:mypwd:*myid2*-myemail2-:mypwd2:*myid3*-myemail3-:mypwd3:";

string[] myid = mystr.Split('*');
string[] myemail = mystr.Split('-');
string[] mypwd = mystr.Split(':');
string ids = "";
string emails = "";
string pwds = "";

 foreach (string k in myid)
{
    Console.WriteLine("THESE ARE THE IDS");
    Console.WriteLine(k);
}
foreach (string k in myemail)
{
    Console.WriteLine("THESE ARE THE EMAILS");
    Console.WriteLine(k);
}
foreach (string k in mypwd)
{
    Console.WriteLine("THESE ARE THE PASSWORDS");
    Console.WriteLine(k);
}

控制台输出如下:

THESE ARE THE IDS

THESE ARE THE IDS
myid
THESE ARE THE IDS
-myemail-:mypwd:
THESE ARE THE IDS
myid2
THESE ARE THE IDS
-myemail2-:mypwd2:
THESE ARE THE IDS
myid3
THESE ARE THE IDS
-myemail3-:mypwd3:
THESE ARE THE EMAILS
*myid*
THESE ARE THE EMAILS
myemail
THESE ARE THE EMAILS
:mypwd:*myid2*
THESE ARE THE EMAILS
myemail2
THESE ARE THE EMAILS
:mypwd2:*myid3*
THESE ARE THE EMAILS
myemail3
THESE ARE THE EMAILS
:mypwd3:
THESE ARE THE PASSWORDS
*myid*-myemail-
THESE ARE THE PASSWORDS
mypwd
THESE ARE THE PASSWORDS
*myid2*-myemail2-
THESE ARE THE PASSWORDS
mypwd2
THESE ARE THE PASSWORDS
*myid3*-myemail3-
THESE ARE THE PASSWORDS
mypwd3
THESE ARE THE PASSWORDS

这就是我想要的样子:

THESE ARE THE PASSWORDS
mypwd
mypwd2
mypwd3

 THESE ARE THE EMAILs
myemail
myemail2
myemail3

THESE ARE THE IDS
myid
myid2
myid3

您可以为此使用 Regular Expressions

string mystr = "*myid*-myemail-:mypwd:*myid2*-myemail2-:mypwd2:*myid3*-myemail3-:mypwd3:";
var matches = Regex.Matches(mystr, @"\*(?<Id>[^*]+)\*-(?<Email>[^-]+)-:(?<Password>[^:]+):");

然后,您可以按以下方式访问匹配项:

foreach (Match match in matches)
{
    Console.WriteLine("Id=" + match.Groups["Id"].Value);
    Console.WriteLine("Email=" + match.Groups["Email"].Value);
    Console.WriteLine("Password=" + match.Groups["Password"].Value);
}

或者,如果您想将 ID、电子邮件和密码组合在一起,请使用:

var ids = matches.OfType<Match>().Select(m => m.Groups["Id"].Value);
var emails = matches.OfType<Match>().Select(m => m.Groups["Email"].Value);
var passwords = matches.OfType<Match>().Select(m => m.Groups["Password"].Value);

foreach (string id in ids)
    Console.WriteLine(id);

foreach (string email in emails)
    Console.WriteLine(email);

foreach (string password in passwords)
    Console.WriteLine(password);

Try it online.

但是请注意,这可能会中断,因为电子邮件地址可能包含连字符,而密码可能包含冒号。在这种情况下,您需要为输入文本想出更稳健的格式。