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

本文关键字:最佳 方法 数据 提取 字符串 | 更新日期: 2023-09-27 18:02:29

我有一个字符串:

__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

我试过这个regex:

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

我不明白为什么'A。工作,但['A]不,我怎么能创建('A;)?

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

[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
}

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

你可以尝试匹配这个正则表达式:

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

描述:

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

regex101演示在代码:

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演示

'A可以工作,但['A]不能,因为当您将'A放在字符类中时,它会像大多数regex元字符一样失去其意义。例如,+*也失去了它们的意义。在['A]中,regex实际上是在尝试匹配'A,因为它在字符类中没有特定的含义,它意味着文字A

方括号创建字符类;您需要括号进行分组,最好是非捕获组。并且您需要使用正向向前看断言而不是第二组,因为每个分号只能匹配一次:

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

仍然没有得到你的参数/值对,所以你可能需要更具体:

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

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

在regex101.com上观看直播