如何从正则表达式中取出某些短语并将它们放入c#中的不同组中

时间:2015-07-27 20:49:20

标签: c# regex

下面是我一直在使用的字符串(示例基于Apple的编码和电子邮件示例):

2.3|[jappleseed@example.com][pwd_removed][johnnyappleseed@example.com][Johnny][Appleseed][APPLES]

这来自我使用的持有帐户的数据库。注册的每个人都必须拥有这些,因此每行的格式都相同。它们将是不同的信息,但仍然格式相同。要注册帐户,您需要用户名,密码(对我来说是不可见的),电子邮件地址和6个字符的代码。

我要做的是将用户名,电子邮件地址,名字,姓氏和6个字符代码放入不同的组中。以下是我一直在研究的正则表达式声明:

^.*\[(.*)\]$

此语句的问题在于它匹配语句中的所有内容,并且我希望它在组中匹配。我知道这是我需要使用Split方法的地方,但我不知道如何使用Split方法在组中放置我想要的东西。所以我的问题是:我是否必须为一个组制作多行代码,或者是否有一种方法可以让我的生活变得更轻松?任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:2)

不需要正则表达式。只需在'['']'上拆分,删除空条目,然后跳过第一部分(2.3):

string[] parts = input.Split(new[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries)
    .Skip(1).ToArray();

答案 1 :(得分:0)

试试这个正则表达式:

(\[[^\]]+\])

Regex live here.

答案 2 :(得分:0)

您要求6个不同的捕获组,因此您正在查看类似的模式:

@"^.*\[(?<username>[^\]]+)\]\[(?<password>[^\]]+)\]\[(?<email>[^\]]+)\]\[(?<fname>[^\]]+)\]\[(?<lname>[^\]]+)\]\[(?<charcode>[^\]]+)\]"

这是一个命名捕获组的示例,可以这样访问:

string data = "2.3|[jappleseed@example.com][pwd_removed][johnnyappleseed@example.com][Johnny][Appleseed][APPLES]";
string pattern = @"^.*\[(?<username>[^\]]+)\]\[(?<password>[^\]]+)\]\[(?<email>[^\]]+)\]\[(?<fname>[^\]]+)\]\[(?<lname>[^\]]+)\]\[(?<charcode>[^\]]+)\]";
Match match = Regex.Match(data, pattern);
if (match.Success)
{
    Console.WriteLine(match.Groups["username"]);
    Console.WriteLine(match.Groups["password"]);
    Console.WriteLine(match.Groups["email"]);
    Console.WriteLine(match.Groups["fname"]);
    Console.WriteLine(match.Groups["lname"]);
    Console.WriteLine(match.Groups["charcode"]);
}

结果:

jappleseed@example.com
pwd_removed
johnnyappleseed@example.com
Johnny
Appleseed
APPLES

否则,从捕获组中删除名称,您的模式如下:

@"^.*\[([^\]]+)\]\[([^\]]+)\]\[([^\]]+)\]\[([^\]]+)\]\[([^\]]+)\]\[([^\]]+)\]"

可以这样访问:

Console.WriteLine(match.Groups[1]);
Console.WriteLine(match.Groups[2]);
Console.WriteLine(match.Groups[3]);
Console.WriteLine(match.Groups[4]);
Console.WriteLine(match.Groups[5]);
Console.WriteLine(match.Groups[6]);