【问题标题】:C# Regex Split - everything inside square bracketsC# Regex Split - 方括号内的所有内容
【发布时间】:2010-10-18 22:41:22
【问题描述】:

我目前正在尝试在 C#(最新的 .NET 和 Visual Studio 2008)中拆分字符串,以便检索方括号内的所有内容并丢弃剩余的文本。

例如:“H1-受体拮抗剂 [HSA:3269] [PATH:hsa04080(3269)]”

在这种情况下,我有兴趣将“HSA:3269”和“PATH:hsa04080(3269)”放入字符串数组中。

如何做到这一点?

【问题讨论】:

    标签: c# regex split


    【解决方案1】:

    Split 在这里帮不了你;你需要使用正则表达式:

    // using System.Text.RegularExpressions;
    // pattern = any number of arbitrary characters between square brackets.
    var pattern = @"\[(.*?)\]";
    var query = "H1-receptor antagonist [HSA:3269] [PATH:hsa04080(3269)]";
    var matches = Regex.Matches(query, pattern);
    
    foreach (Match m in matches) {
        Console.WriteLine(m.Groups[1]);
    }
    

    产生你的结果。

    【讨论】:

    • 你是否觉得在 3.5 中 MatchCollection 枚举器仍然返回 Match 作为 Object 很尴尬?
    • 无论如何...更好的正则表达式匹配可能是 [([^]]*)] 以便安全起见:-)
    • @chakrit: 1. 是的,但出于向后兼容性的原因,这不能更改。不过真的很可惜。微软应该像 Python 3 一样有胆量:把 2.0 之前的所有东西都扔掉,并引入一个突破性的变化。但这不会发生……
    • @chakrit: 2. 这确实是我的第一个版本(我通常总是使用显式组),但我重新考虑了,因为表达完全相同的模式更冗长(出于所有实际目的)。在这里使用更隐含的字符类和非贪婪量词确实没有风险。
    • @KonradRudolph - 我在这里得到这个“[HSA:3269]”......如果我想要“HSA:3269”,那么正则表达式会是什么。没有方括号?
    【解决方案2】:

    试试这个

    string mystr = "Hello my name is  {robert} and i live in  {florida}";
    
    List<string> myvariables = new List<string>();
    while (mystr.Contains("{"))
    {
        myvariable.Add(mystr.Split('{', '}')[1]);
        mystr = mystr.Replace("{" + mystr.Split('{', '}')[1] + "}", "");
    };
    

    这样我将有一个包含罗伯特和佛罗里达的数组。

    【讨论】:

    • 这段代码假设括号总是完美匹配的(你在{之前从来没有},你也从来没有连续两次有{。它也非常低效,因为它分裂不必要地多次使用字符串。像其他答案一样使用正则表达式会更加有效和健壮。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 2020-02-28
    相关资源
    最近更新 更多