我如何用正则表达式解析子字符串?

时间:2011-05-18 08:18:53

标签: c# regex

我的非解析数据示例是

"8$154#3$021308831#7$NAME SURNAME#11$2166220160#10$5383237309#52$05408166#"

我想解析$和#字符串之间的数据。 我希望看到这样的结果;

8$#之间 - >我的数据是154
3$#之间 - >我的数据是021308831
7$#之间 - >我的数据是NAME SURNAME
11$#之间 - >我的数据是2166220160
10$#之间 - >我的数据是5383237309
52$#之间 - >我的数据是05408166

感谢您的回复。

6 个答案:

答案 0 :(得分:4)

(\d+\$)(.*?)#

See it on Rubular

您将在捕获组1中找到第一部分(例如8$),并在组2中找到相应的数据。

括号负责,结果是在那些捕获组中。 \d+将匹配至少一位数。 .*?是所有内容的懒惰匹配,直到下一个#

答案 1 :(得分:1)

您可以根据#拆分成阵列。 与

String[] entries = data.Split('#');

你会得到一个“8 $ 154”,“3 $ 021308831”等阵列。

现在您只需使用条目并将每个条目拆分为美元符号:

String[] tmp = entries[0].Split('$');

所以你得到了

tmp[0] = "8";
tmp[1] = "154";

建立一些检查,你会很高兴。我想这里不需要正则表达式。

如果您有“8 $ 15 $ 4#3 $ 021308831”,那么您将进入tmp

tmp[0] = "8"; // your key!
tmp[1] = "15"; // data part
tmp[2] = "4"; // data part ($ is missing!)

所以你必须在索引1之上连接所有tmp:

StringBuilder value = new StringBuilder();
for(int i = 1; i < tmp.Length; i++)
{
    if(i > 1) value.Append("$");
    value.Append(tmp[i]);
}

答案 2 :(得分:1)

class Program
{
    static void Main(string[] args)
    {
        string text = "8$154#3$021308831#7$NAME SURNAME#11$2166220160#10$5383237309#52$05408166#";
        string[] values = text.Split('$', '#');
        for (var i = 0; i < values.Length - 1; i = i + 2)
        {
            Console.WriteLine("Between " + values[i] + "$ and # -> My data is " + values[i+1]);
        }
        Console.ReadLine();
    }
}

答案 3 :(得分:1)

好的,取stema的表达式,这有效。

using System.Text.RegularExpressions;

string nonParsed = "8$...";

MatchCollection matches = Regex.Matches(nonparsed, @"(\d+\$)(.*?)#");

StringBuilder result = new StringBuilder();

for(int i = 0; i < matches.Count; i++)
{
    Match match = matches[i];

    result.AppendFormat("Between {0} and #-> My data is {1}")
        match.Groups[1].Value,
        match.Groups[2].Value);

    if (i < matches.Count - 1)
    {
        result.AppendLine(",");
    }
    else
    {
        result.Append(".");
    }
}

return result.ToString();

感谢stema,这可以解决价值中的$重复问题。

答案 4 :(得分:0)

如果你想使用正则表达式,应该这样做。

\$([\w\d\s]+)\#

答案 5 :(得分:0)

这将匹配$和#:

\$(.*?)#