2

我需要从表达式的数字部分删除前导零(使用 .net 2.0 C# Regex 类)。

前任:

PAR0000034 -> PAR34

WP0003204 -> WP3204

我尝试了以下方法:

//keep starting characters, get rid of leading zeroes, keep remaining digits
string result = Regex.Replace(inputStr, "^(.+)(0+)(/d*)", "$1$3", RegexOptions.IgnoreCase)

显然,它没有用。我需要一些帮助才能找到错误。

4

4 回答 4

3

在您的表达式中,该.*部分是贪婪的,因此它会捕获完整的字符串。进一步使用反斜杠而不是斜杠作为数字\d

string result = Regex.Replace(inputStr, @"^([^0]+)(0+)(\d*)", "$1$3");

或者改用look behind:

string result = Regex.Replace(inputStr, "(?<=[a-zA-Z])0+", "");
于 2012-10-15T18:07:36.260 回答
3

您不需要正则表达式,该Split方法可以为您做到这一点。

拆分'0',删除空条目(即在多个零之间),并将结果限制为两个字符串将为您提供前导零之前和之后的两个字符串。然后你只需将这两个字符串再次放在一起:

string result = String.Concat(
  input.Split(new char[] { '0' }, 2, StringSplitOptions.RemoveEmptyEntries)
);
于 2012-10-15T18:12:46.297 回答
0

这对我有用:

Regex.Replace("PPP00001001", "([^0]*)0+(.*)", "$1$2");
于 2012-10-15T18:11:50.760 回答
0

短语“前导零”令人困惑,因为您所说的零实际上并不是字符串的开头。但如果我理解正确,你想要这个:

string result = Regex.Replace(inputStr, "^(.*?)0+", "$1");

实际上有几种方法可以做到这一点,有和没有正则表达式,但上面可能是最短和最容易理解的。重要的部分是.*?惰性量词。这将确保它 a) 仅找到第一个零字符串,并且 b) 删除字符串中的所有“前导”零。

于 2012-10-15T18:21:49.730 回答