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

本文关键字:正则表达式 是什么 数字 删除 | 更新日期: 2023-09-27 18:18:06

我有这个格式的数据

"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]

但是我无法弄清楚如何获得数量,无论我尝试什么表达方式,3SUIT 3 PCS随之而来,就像这些

var allQtyAry = Regex.Replace(dataForPackageConsume, "[^('':+''d)]", "").split(':') 

这显示为:1:3:1:13:1:1(更换时(。所以我不能按:分开来让它成为数组,因为可以看出第四项是13,而它应该是13来自SUIT 3 PCS。我也尝试了其他一些变体,但SUIT 3 PCS 3总是弹出。我如何获得衣服的数量(可能附有:,这样我就可以按此拆分它们并形成数组?

更新 :如果我之前没有说清楚,我想要前面的数字:和分号

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

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

与其删除除数字以外的所有内容,不如只匹配数字

例如:

Regex regex = new Regex(@":'d+");
string result = string.Empty;
foreach (Match match in regex.Matches(input))
    result += match.Value;

[^'d:]+|:(?!'d)|(?<!:)'d+

[^'d:]+将匹配所有非数字非:

:(?!'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

你只想要像: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

演示

这将适用于一个替换:

var allQtyAry = Regex.Replace(dataForPackageConsume, @"[^_:]+:", "").split('_')

解释:

[^_:]意味着匹配任何不是_:

的东西

[^_:]+:表示匹配任何至少一个字符的序列,这些字符不匹配_:,但以:结尾

由于正则表达式默认是贪婪的(即它们尽可能多地抓取(,匹配将从字符串的开头或每个_之后开始:

新项目:1_皮带:3_牛仔裤:1_皮带:1_套装 3 件:1_鞋子:1

删除匹配的部分(上面的斜体粗体位(会导致:

1_3_1_1_1_1

_拆分会导致:

[1, 3, 1, 1, 1, 1]

试试这个正则表达式[^:'d+?].*?(?=:),它应该可以解决问题

string[] list = Regex.Replace(test, @"[^:'d+?].*?(?=:)", string.Empty).Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

正则表达式匹配并用空字符串替换冒号之前的所有内容(排除(.*?(?=:)。 它还从匹配[^:'d+?]中排除 :#,因此您最终会在拆分之前得到:1:3:1:1:1:1