删除除数字之外的所有内容的正则表达式是什么?

时间:2013-06-13 10:21:31

标签: c# regex c#-4.0 regex-negation

我的数据格式为

"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,而它应该是13即将到来来自SUIT 3 PCS。我还尝试了其他一些变体,但是来自3的{​​{1}}始终会弹出。我如何才能获得大量的衣服(可能附加SUIT 3 PCS所以我可以通过这个来分割它们形成阵列?

更新:如果我在之前没有说清楚,我希望完全的数字前面加: 分号

所以,我想要的是:1:3:1:1:1:1

5 个答案:

答案 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