正则表达式:如果字符串的第二个数字不是0,则先删除0

时间:2013-09-18 15:16:06

标签: regex phone-number

我必须使用Regex电话号码进行清理。 有时我得到的电话号码从0开始,在这种情况下我不想保留链的其余部分:

  • 例如:0666777888 - > 666777888

对于我希望的国际号码:

  • 例如:00034666777888 - > 0034666777888

但我的问题是,表达式不应该更改任何正确的国际号码(从00开始)

  • 例如:0034666777888 - > 0034666777888

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

4 个答案:

答案 0 :(得分: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'

答案 1 :(得分:2)

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

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

并且一无所获。

regex101 demo


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

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

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

reex101 demo


说明

^                     // 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

答案 2 :(得分:1)

Java版:

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

答案 3 :(得分:1)

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

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

将匹配替换为:\ 1 \ 2