有条件地格式化数字字符串的正则表达式

Flo*_*ian 5 c# regex string

删除了原始问题


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

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)

Wis*_*guy 5

只有当它不在字符串的开头时才能使用lookbehind 来匹配,(0)并在你正在做的时候用空字符串替换.

(删除原始解决方案)


再次更新以反映新要求

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

^[0\D]+|(?<=^[^(]*)\(0\)|\D
Run Code Online (Sandbox Code Playgroud)

请注意,大多数正则表达式引擎不支持可变长度的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]"
Run Code Online (Sandbox Code Playgroud)

(regexhero.net上测试)


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

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

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