删除除数字以外的所有内容的正则表达式是什么
本文关键字:正则表达式 是什么 数字 删除 | 更新日期: 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]
但是我无法弄清楚如何获得数量,无论我尝试什么表达方式,3
从SUIT 3 PCS
随之而来,就像这些
var allQtyAry = Regex.Replace(dataForPackageConsume, "[^('':+''d)]", "").split(':')
这显示为:1:3:1:13:1:1
(更换时(。所以我不能按:
分开来让它成为数组,因为可以看出第四项是13
,而它应该是1
,3
来自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