【问题标题】:RegEx: Split string by separator and then by another正则表达式:按分隔符拆分字符串,然后再按另一个
【发布时间】:2013-06-12 12:20:57
【问题描述】:

所需行为存在问题。

假设有一个

sourceString = @"name1$$value1^name2$$value2^name3$$value3";

也许更长的字符串...

我想先用^ 分隔符分割,然后再用另一个$$ 分割,以根据这个名称-值对创建字典。

此字符串存储在文件中,因此可能太长,任何拆分操作都可能花费太多时间。 我希望有一个由^ 匹配和$$ 内部组匹配的正则表达式。

【问题讨论】:

    标签: c# .net regex


    【解决方案1】:

    这个正则表达式(.*?)\$\$(.*?)(?:\^|$) 将匹配名称值对,这里是Rubular to prove it。要使用它,您可以使用以下代码:

    var input = "name1$$value1^name2$$value2^name3$$value3";
    var pattern = @"(.*?)\$\$(.*?)(?:\^|$)";
    var hash = new Dictionary<string, string>();
    var match = Regex.Match(input, pattern);
    
    while (match.Success)
    {
        hash.Add(match.Groups[1].Value, match.Groups[2].Value);
        match = match.NextMatch();
    }
    

    【讨论】:

    • 我假设它是@"(?(.*?))\$\$(?(.*?))(?:\^|$)
    • @Lonli-Lokli,是的,这是正确的。你看过Rubular吗?匹配的组在右侧。另外,请参阅我的编辑以了解使用情况。
    • 是的,我刚刚为 LINQPad 修改了您的变体。谢谢你的版本!
    【解决方案2】:

    为什么不使用:

    sourceString.Split(new char[] {'^'}, StringSplitOptions.RemoveEmptyEntries)
    

    那么你可以对 $$ 做同样的事情

    【讨论】:

    • 正如我之前提到的,这将是一个耗时的操作。
    • 你确定简单的拆分比正则表达式更耗时吗?
    • 现在我正在检查 ^) 但要检查我首先需要一个正确的正则表达式。 Ps 无论如何我确定...
    • 嗯。实际上,split 的效果是编译正则表达式的 4 倍。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2014-11-22
    • 2011-02-24
    相关资源
    最近更新 更多