从字符串中提取数据的最佳方法

时间:2014-05-08 15:43:00

标签: c# regex

我有一个字符串:

__cfduid=d2eec71493b48565be764ad44a52a7b191399561601015; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.planetminecraft.com; HttpOnly

我想使用正则表达式并得到类似的东西:

[0] = __cfduid=d2eec71493b48565be764ad44a52a7b191399561601015
[1] = expires=Mon, 23-Dec-2019 23:50:00 GMT
[2] = path=/
[3] = domain=.planetminecraft.com
[4] = HttpOnly

我试过这个正则表达式:

[\A|;](.*?)[\Z|;]

我不明白为什么\A。虽然有效但[\A]没有,我该如何创建(\A;)?

在这个正则表达式的最终形式中,我想从字符串中获取:

[0] = {
    [0] = __cfduid
    [1] = d2eec71493b48565be764ad44a52a7b191399561601015
}
[1] = {
    [0] = expires
    [1] = Mon, 23-Dec-2019 23:50:00 GMT
}
[2] = {
    [0] = path
    [1] = /
}
[3] = {
    [0] = domain
    [1] = .planetminecraft.com
}
[4] = {
    [0] = HttpOnly
}

2 个答案:

答案 0 :(得分:1)

方括号创建character class;你需要括号进行分组,最好是非capturing groups。并且您需要使用positive lookahead assertion而不是第二个组,因为每个分号只能匹配一次:

(?:\A|;)(.*?)(?=\Z|;)

仍然无法获得参数/值对,因此您可能希望更具体:

(?:\A|;\s*)([^=]*)(?:=([^;]*))?(?=\Z|;)

[^=]*匹配除=以外的任意数量的字符。)

live on regex101.com

答案 1 :(得分:1)

您可以尝试匹配此正则表达式:

\s*([^=;]+)(?:=([^=;]+))?

说明

\s*         # Match any spaces
([^=;]+)    # Match any non = or ; characters
(?:
  =         # Match an = sign
  ([^=;]+)  # Match any non = or ; characters.
)?          # Make this group optional

regex101 demo

在代码中:

string text = "__cfduid=d2eec71493b48565be764ad44a52a7b191399561601015; expires=Mon, 23-Dec-2019 23:50:00 GMT; path=/; domain=.planetminecraft.com; HttpOnly";

var regex = new Regex(@"\s*([^=;]+)(?:=([^=;]+))?");
var matches = regex.Matches(text);
foreach (Match match in matches)
{
    Console.WriteLine(match.Groups[1].Value + "\n" + match.Groups[2].Value + "\n");
}

ideone demo


\A有效但[\A]不起作用,因为当您将\A放入字符类时,它会像大多数正则表达式元字符一样失去意义。例如,+*也失去了意义。在[\A]中,正则表达式实际上是在尝试匹配\A,因为它在字符类中没有特定含义,它意味着文字A