1

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

 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
4

5 回答 5

2

我建议您执行以下操作

  1. 使用以 ',' 字符作为分隔符的字符串拆分(例如输出 req:{REQUESTER_NAME})
  2. 对于每对数据,使用 ';' 进行字符串拆分 字符作为分隔符(例如输出“req”、“{REQUESTER_NAME}”)
  3. 用“”对字符'{'和'}'进行字符串替换(例如输出REQUESTER_NAME)
  4. 再次使用 ',' 字符作为分隔符进行字符串拆分(例如输出“ABC123”、“DEF-123”)

那应该完美地为您解析它。当结果进来时,您可以将结果存储到您的数据结构中。(例如,您可以在第 2 步存储名称,而某些值可能在第 3 步可用,而另一些在第 4 步可用)

希望有所帮助

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

于 2013-11-03T02:19:16.020 回答
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);
                }
            }
        }
于 2013-11-03T04:08:50.767 回答
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
}
于 2013-11-03T04:34:05.393 回答
0

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

<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...

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

于 2013-11-03T03:03:52.883 回答
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", ""

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

于 2013-11-03T03:05:44.340 回答