我需要一些帮助来匹配此示例字符串中的数据:
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
答案 0 :(得分:2)
我建议你做以下
那应该完美地为你解析。您可以在结果进入时将结果存储到数据结构中。(例如,您可以在步骤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", ""
请注意,在参数及其值之后,数组中将出现一个空字符串。循环遍历数组时,您可以使用它来让程序知道何时启动新参数。然后,您可以创建一个新的数组/数据结构来存储其值。