我必须删除字符串中的所有零,但我必须将数字保留为零。
我收到的字符串格式类似于“zeroes-letter-zeroes-number”,没有' - ',数字总是整数。几个例子:
"0A055" -> "A55"
"0A050" -> "A50"
"0A500" -> "A500"
"0A0505" -> "A505"
"0055" -> "55"
"0505" -> "505"
"0050" -> "50"
我知道我可以通过字符串中的字符进行迭代,并在遇到字母或不同于0的数字时设置标记,但我认为使用RegEx会更好。如果我必须在数据库中使用此算法,RegEx也会更有帮助。
我尝试过这样的事情,但我没有得到我想要的结果:
Regex r = new Regex(@"[0*([a-zA-Z]*)0*([1-9]*)]");
string result = r.Replace(input, "");
我写RegEx-es不太好,所以如果可以,请帮助我。
答案 0 :(得分:3)
我不相信正则表达式是解决此问题的最佳方法,但是这个适用于所有测试用例:
string clean = Regex.Replace(dirty, @"(?<!\d)0+|0+(?!\d|$)", "");
答案 1 :(得分:2)
如果我正确理解您的模式,the following should work。
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
List<String> samples = new List<String>(new[]{
"0A055","0A050","0A500","0A0505","0055","0505","0050"
});
String re = @"^0*([A-Z]*)0*([1-9]\d*)$";
// iterate over all results
samples.ForEach(n => {
Console.WriteLine("\"{0}\" -> \"{1}\"",
n,
Regex.Replace(n, re, "$1$2")
);
});
}
}
使用以下输出:
"0A055" -> "A55"
"0A050" -> "A50"
"0A500" -> "A500"
"0A0505" -> "A505"
"0055" -> "55"
"0505" -> "505"
"0050" -> "50"
基本上使用模式来否定所有无关紧要的0,并使用正则表达式替换分组重新连接“有意义”的数字(以及存在时的字母)。
答案 2 :(得分:1)
和其他一些人一样,我不确定正则表达式是最好的想法,但这适用于测试用例:
0+(?=[0-9].)|0(?=[a-zA-z])|(?<=[a-zA-Z])0+
答案 3 :(得分:0)
由于您似乎只有一个字母,因此您可以在该字母上将字符串分成两半。
在左侧部分,修剪全部零。
在右侧部分,将其转换为数字,这将删除所有前导零或您可以使用TrimStart。
答案 4 :(得分:0)
使用正则表达式进行替换比提取所需的值要困难得多。因此,请尝试使用下面的简单正则表达式匹配字符串
0*(?<letter>[A-Z])0*(?<number>\d*)
您的匹配结果将包含两个组,字母和数字。取两组的价值并追加它们,你就会得到你想要的东西。
答案 5 :(得分:0)
这是一个Perl的答案,它的价值
s/0*([a-zA-Z]*)0*([1-9]+0*)/$1$2/g
答案 6 :(得分:0)
我不知道如何在.net中实现正则表达式,所以我会让你在System.Text.Regularexpressions.Regex (MSDN)
中用玩具写出正确的代码无论哪种方式,这种模式都应该有效(伪代码):
Replace "(0*)(.+)" by "$2"
0*
表示零或更多0
.+
表示除行尾之外的任何字符
$2
表示第二组括号(因此我们只是丢弃字符串的(0*
)部分。)