我的数据格式为
"NEW ITEM:1_BELT:3_JEANS:1_BELT:1_SUIT 3 PCS:1_SHOES:1"
格式为Item1:Item1Qty_Item2:Item2Qty.........ItemN:ItemNQty
我需要选择项目及其相应的数量并形成数组。我做了像这样的项目部分..
var allItemsAry = Regex.Replace(myString, "[\\:]+\\d", "").Split('_');
现在allItemsAry
与[NEW ITEM, BELT, JEANS, BELT, SUIT 3 PCS, SHOES]
但是我无法弄清楚如何获得数量,无论我尝试3
来自SUIT 3 PCS
的那些表达式,就像这些
var allQtyAry = Regex.Replace(dataForPackageConsume, "[^(\\:+\\d)]", "").split(':')
这是:1:3:1:13:1:1
(替换时)。所以我无法通过:
分隔得到make it数组,可以看出第四项是13
,而它应该是1
,3
即将到来来自SUIT 3 PCS
。我还尝试了其他一些变体,但是来自3
的{{1}}始终会弹出。我如何才能获得大量的衣服(可能附加SUIT 3 PCS
所以我可以通过这个来分割它们形成阵列?
更新:如果我在之前没有说清楚,我希望完全的数字前面加:
分号。
所以,我想要的是:1:3:1:1:1:1 。
答案 0 :(得分:3)
除了删除除数字之外的所有内容,如何匹配仅数字?
例如:
Regex regex = new Regex(@":\d+");
string result = string.Empty;
foreach (Match match in regex.Matches(input))
result += match.Value;
答案 1 :(得分:3)
[^\d:]+|:(?!\d)|(?<!:)\d+
[^\d:]+
将匹配所有非数字非:
s。
:(?!\d)
将匹配所有:
后面没有数字(负向前瞻)。
(?<!:)\d+
将匹配前面没有:
的所有数字(负面后瞻)。
来源
NEW ITEM:1_BELT:3_JEANS:1_BELT:1_SUIT 3 PCS:1_SHOES:1
正则表达式
[^\d:]+|:(?!\d)|(?<!:)\d+
结果 匹配
NEW ITEM
_BELT
_JEANS
_BELT
_SUIT
3
PCS
_SHOES
答案 2 :(得分:2)
您只想要 :1:3:1:1:3:1:1
之类的数字?
string s = "NEW ITEM:1_BELT:3_JEANS:1_BELT:1_SUIT 3 PCS:1_SHOES:1";
var output = Regex.Replace(s, @"[^0-9]+", "");
StringBuilder sb = new StringBuilder();
foreach (var i in output)
{
sb.Append(":" + i);
}
Console.WriteLine(sb); // :1:3:1:1:3:1:1
这是 DEMO
。
好的,如果在:
之后每个字符都是数字,那么您可以像使用它一样;
string s = "NEW ITEM:1_BELT:3_JEANS:1_BELT:1_SUIT 3 PCS:1_SHOES:1";
var array = s.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
StringBuilder sb = new StringBuilder();
foreach (var item in array)
{
if (Char.IsDigit(item[0]))
{
sb.Append(":" + item[0]);
}
}
Console.WriteLine(sb); //:1:3:1:1:1:1
<强> DEMO 强>
答案 3 :(得分:1)
这适用于一个替换:
var allQtyAry = Regex.Replace(dataForPackageConsume, @"[^_:]+:", "").split('_')
<强>解释强>
[^_:]
表示匹配任何不 _
或:
[^_:]+:
表示匹配至少一个与_
或:
不匹配的字符的任何序列,但以:
由于正则表达式默认是贪婪的(即它们尽可能多地抓取),匹配将从字符串的开头或每个_
开始:
新项目: 1_ BELT: 3_ 牛仔裤: 1_ BELT: 1_ SUIT 3 PCS: 1_ 鞋子:< / em> 1
删除匹配的部分(上面的斜体粗体位)会导致:
1_3_1_1_1_1
按_
拆分会产生:
[1, 3, 1, 1, 1, 1]
答案 4 :(得分:0)
尝试使用此正则表达式[^:\d+?].*?(?=:)
,它应该可以解决这个问题
string[] list = Regex.Replace(test, @"[^:\d+?].*?(?=:)", string.Empty).Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);
正则表达式匹配并替换冒号前面的空字符串:(独占).*?(?=:)
。它还会从匹配[^:\d+?]
中排除:#,因此您在分割前最终会遇到:1:3:1:1:1:1