5

原始问题已删除


我正在寻找一个正则表达式,它将包含特殊字符、字符和数字的字符串格式化为仅包含数字的字符串。在某些特殊情况下,仅将所有非数字字符替换为“”(空)是不够的。

1.) 括号中的零。

  • 如果括号 (0) 中只有零,如果它是第一个括号对,则应将其删除。(不应删除仅包含零的第二个括号对)

2.) 前导零。

  • 应删除所有前导零(忽略括号)

更好理解的例子:

  • 123 (0) 123 would be 123123 (zero removed)
  • (0) 123 -123 would be 123123(zero and all other non-numeric characters removed)
  • 2(0) 123 (0) would be 21230 (first zero in brackets removed)
  • 20(0)123023(0) would be 201230230 (first zero in brackets removed)
  • 00(0)1 would be 1(leading zeros removed)
  • 001(1)(0) would be 110 (leading zeros removed)
  • 0(0)02(0) would be 20 (leading zeros removed)
  • 123(1)3 would be 12313 (characters removed)
4

4 回答 4

5

只有当它不在字符串的开头时,您才可以使用 向匹配(0),并在您正在做的时候用空字符串替换。

(原解决方案已删除)


再次更新以反映新要求

匹配前导零,(0)仅当它是第一个带括号的项目时匹配,并且匹配任何非数字字符:

^[0\D]+|(?<=^[^(]*)\(0\)|\D

请注意,大多数正则表达式引擎不支持可变长度的lookbehinds(即使用量词,如*),因此这只适用于少数正则表达式引擎——.NET 就是其中之一。

^[0\D]+      # zeroes and non-digits at start of string
|            # or
(?<=^[^(]*)  # preceded by start of string and only non-"(" chars
\(0\)        # "(0)"
|            # or
\D           # non-digit, equivalent to "[^\d]"

regexhero.net测试)


您现在已经多次更改和添加要求。对于这样的多个规则,您最好单独为它们编码。如果一个条件匹配并导致另一个条件不匹配,则可能会变得复杂且难以调试。例如,在单独的步骤中:

  1. 根据需要删除括号中的项目。
  2. 删除非数字字符。
  3. 删除前导零。

但是如果你绝对需要这三个条件都匹配在一个正则表达式中(不推荐),这里就是。

于 2013-03-06T15:03:42.130 回答
1

这个正则表达式应该非常接近您正在搜索的那个。

(^[^\d])|([^\d](0[^\d])?)+

(您可以替换空字符串捕获的所有内容)

编辑 :

您的请求发生了变化,现在变得很复杂,只需通过一次即可处理。假设您总是在括号组之前有一个空格,您可以使用这些通行证(保持此顺序):

string[] entries = new string[7] {
    "800 (0) 123 - 1",
    "800 (1) 123",
    "(0)321 123",
    "1 (0) 1",
    "1 (12) (0) 1",
    "1 (0) (0) 1",
    "(9)156 (1) (0)"
};
foreach (string entry in entries)
{
    var output = Regex.Replace(entry , @"\(0\)\s*\(0\)", "0");
    output = Regex.Replace(output, @"\s\(0\)", "");
    output = Regex.Replace(output, @"[^\d]", "");
    System.Console.WriteLine("---");
    System.Console.WriteLine(entry);
    System.Console.WriteLine(output);
}
于 2013-03-06T15:01:36.050 回答
1

如果您可以使用多次传递,正则表达式会变得非常简单。我认为如果它不是字符串中的第一件事,你可以做第一次通过删除你的 (0),然后删除非数字:

var noMidStrParenZero = Regex.Replace(text, "^([^(]+)\(0\)", "$1");
var finalStr = Regex.Replace(noMidStrParenZero, "[^0-9]", "");

避免了很多正则表达式的疯狂,并且它在一定程度上也是自我记录的。

编辑:这个版本也应该适用于你的新例子。

于 2013-03-06T15:09:32.973 回答
0
(?:     # start grouping
    ^   # start of string
    |   # OR
    ^\( # start of string followed by paren
    |   # OR
    \d  # a digit
)       # end grouping
(0+)    # capture any number of zeros
|       # OR
([1-9]) # capture any non-zero digit

这适用于您的所有示例字符串,但整个表达式确实与(后面的零匹配。您可以使用Regex.Matches全局匹配来获取匹配集合,然后将所有匹配的组加入一个字符串以仅获取数字(或仅删除任何非数字)。

于 2013-03-06T15:10:33.997 回答