1

我必须清理正则表达式电话号码。有时我会得到以 0 开头的电话号码,在这种情况下,我不想保留链的其余部分:

  • 例如:0666777888 --> 666777888

对于国际号码,我希望:

  • 例如:00034666777888 --> 0034666777888

但我的问题是,表达式不应该改变正确的国际号码(以 00 开头)

  • 例如:0034666777888 --> 0034666777888

始终有效的规则是:如果字符串以 1 或 3 '0' 开头,则删除第一个 '0' 否则保持字符串原样。

4

4 回答 4

2

用作^0(?!0)图案。

Python 示例:

>>> re.sub(r'^(?!00[^0])0', '', '0666777888')
'666777888'
>>> re.sub(r'^(?!00[^0])0', '', '00034666777888')
'0034666777888'
>>> re.sub(r'^(?!00[^0])0', '', '0034666777888')
'0034666777888'

Javascript:

> '0666777888'.replace(/^(?!00[^0])0/, '')
'666777888'
> '00034666777888'.replace(/^(?!00[^0])0/, '')
'0034666777888'
> '0034666777888'.replace(/^(?!00[^0])0/, '')
'0034666777888'
于 2013-09-18T15:18:09.853 回答
2

如果您使用的语言支持负前瞻,则可以使用此正则表达式:

^(?!00[1-9])0

并无所取代。

正则表达式101演示


根据评论,要删除引号(如果存在),您可以使用:

^"?(?:(?!00[1-9])0([0-9]+)|(00[0-9]+))"?$

并替换为$1$2. (或\1\2取决于语言/引擎)

reex101 演示


解释

^                     // Matches beginning of line
   "?                 // Matches opening double quotes if present
      (?:             // Begin of non-capture group
          (?!00[1-9]  // Prevents the match of two zeroes followed by a digit other than zero
          0           // Matches 0
          ([0-9]+)    // Matches all the digits after 0 and store in first capture group
      |               // Or...
          (00[0-9]+)  // Two zeroes followed by any number of digits in second capture group
      )               // End of non-capture group
   "?                 // Matches closing double quotes if present
$                     // Matches end of line
于 2013-09-18T15:21:00.070 回答
1

爪哇版:

System.out.println("034666777888".replaceAll("^0(?!0[1-9]+)([0-9]*)","$1"));
System.out.println("00034666777888".replaceAll("^0(?!0[1-9]+)([0-9]*)","$1"));
System.out.println("0034666777888".replaceAll("^0(?!0[1-9]+)([0-9]*)","$1"));

输出:

34666777888
0034666777888
0034666777888
于 2013-09-18T15:26:52.093 回答
1

我认为这个正则表达式应该可以帮助你:

(?=0*)(00)*([1-9][\d]*)

将匹配替换为:\1\2

于 2013-09-18T15:42:53.110 回答