使用正则表达式(正则表达式)拆分数据

时间:2013-11-03 02:07:13

标签: c# .net vb.net

我需要一些帮助来匹配此示例字符串中的数据:

 req:{REQUESTER_NAME},key:{abc},act:{UPDATE},sku:{ABC123,DEF-123},qty:{10,5}

基本上,每个参数都以“,”分隔,但它也包含在{}中,我需要一些正则表达式的帮助,因为我对它不太好。

期望的输出:

req = "REQUESTER_NAME"
key = "abc"
act = "UPDATE"
sku[0] = "ABC123"
sku[1] = "DEF-123"
qty[0] = 10
qty[1] = 5

5 个答案:

答案 0 :(得分:2)

我建议你做以下

  1. 使用字符串拆分并使用','字符作为分隔符(例如输出请求:{REQUESTER_NAME})
  2. 使用每对数据,使用';'进行字符串拆分字符作为分隔符(例如输出“req”,“{REQUESTER_NAME}”)
  3. 使用“”替换字符'{'和'}'的字符串(例如输出REQUESTER_NAME)
  4. 再次使用','字符作为分隔符进行字符串拆分(例如输出“ABC123”,“DEF-123”)
  5. 那应该完美地为你解析。您可以在结果进入时将结果存储到数据结构中。(例如,您可以在步骤2中存储名称,而某些值可能在步骤3中可用,而其他人可以在步骤4中使用)

    希望帮助

    注意: - 如果你不知道字符串拆分 - http://www.dotnetperls.com/split-vbnet - 如果你不知道字符串替换 - http://www.dotnetperls.com/replace-vbnet

答案 1 :(得分:2)

以下示例可能有助于解决您的问题。但是这里有很多字符串操作。

        string input = "req:{REQUESTER_NAME},key:{abc},act:{UPDATE},sku:{ABC123,DEF-123},qty:{10,5}";

        Console.WriteLine(input);

        string[] words = input.Split(new string[] { "}," }, StringSplitOptions.RemoveEmptyEntries);

        foreach (string item in words)
        {
            if (item.Contains(':'))
            {
                string modifiedString = item.Replace(",", "," + item.Substring(0, item.IndexOf(':')) + ":");

                string[] wordsColl = modifiedString.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

                foreach (string item1 in wordsColl)
                {
                    string finalString = item1.Replace("{", "");
                    finalString = finalString.Replace("}", "");
                    Console.WriteLine(finalString);
                }
            }
        }

答案 2 :(得分:1)

首先,使用Regex.Matches获取{}内的参数。

string str = "req:{REQUESTER_NAME},key:{abc},act:{UPDATE},sku:{ABC123,DEF-123},qty:{10,5}";
MatchCollection matches = Regex.Matches(str,@"\{.+?\}");
string[] arr = matches.Cast<Match>()
                    .Select(m => m.Groups[0].Value.Trim(new char[]{'{','}',' '}))
                    .ToArray();
foreach (string s in arr)
    Console.WriteLine(s);

<强>输出

REQUESTER_NAME
abc
UPDATE
ABC123,DEF-123
10,5

然后使用Regex.Split获取参数名称

string[] arr1 = Regex.Split(str,@"\{.+?\}")
                         .Select(x => x.Trim(new char[]{',',':',' '}))
                         .Where(x => !string.IsNullOrEmpty(x)) //need this to get rid of empty strings
                         .ToArray();
foreach (string s in arr1)
    Console.WriteLine(s);

<强>输出

req
key
act
sku
qty

现在您可以轻松遍历参数。像这样的东西

for(int i=0; i<arr.Length; i++)
{
    if(arr1[i] == "req")
        //arr[i] contains req parameters
    else if(arr1[i] == "sku")
        //arr[i] contains sku parameters
        //use string.Split(',') to get all the sku paramters and process them
}

答案 3 :(得分:0)

基肖尔的回答是正确的。此扩展方法可能有助于实现该建议:

<Extension()>
Function WideSplit(InputString As String, SplitToken As String) As String()
    Dim aryReturn As String()
    Dim intIndex As Integer = InputString.IndexOf(SplitToken)
    If intIndex = -1 Then
        aryReturn = {InputString}
    Else
        ReDim aryReturn(1)
        aryReturn(0) = InputString.Substring(0, intIndex)
        aryReturn(1) = InputString.Substring(intIndex + SplitToken.Length)
    End If
    Return aryReturn
End Function

如果您导入System.Runtime.CompilerServices,您可以像这样使用它:

Dim stringToParse As String = "req:{REQUESTER_NAME},key:{abc},act:{UPDATE},sku:{ABC123,DEF-123},qty:{10,5}"
Dim strTemp As String
Dim aryTemp As String()
strTemp = stringToParse.WideSplit("req:{")(1)
aryTemp = strTemp.WideSplit("},key:{")
req = aryTemp(0)
aryTemp = aryTemp(1).WideSplit("},act:{")
key = aryTemp(0)
'etc...

但是,您可以更有效地执行此操作,因为此方法会创建许多临时字符串分配。

答案 4 :(得分:0)

Kishore的解决方案是完美的,但这是另一种适用于正则表达式的解决方案:

Dim input As String = "req:{REQUESTER_NAME},key:{abc},act:{UPDATE},sku:{ABC123,DEF-123},qty:{10,5}"
Dim Array = Regex.Split(input, ":{|}|,")

这基本相同,它使用正则表达式来分割:{},。解决方案可能会稍微缩短一点。这些值将被放入数组中:

"req", "REQUESTER_NAME","", ... , "qty", "10", "5", ""

请注意,在参数及其值之后,数组中将出现一个空字符串。循环遍历数组时,您可以使用它来让程序知道何时启动新参数。然后,您可以创建一个新的数组/数据结构来存储其值。