我必须清理正则表达式电话号码。有时我会得到以 0 开头的电话号码,在这种情况下,我不想保留链的其余部分:
- 例如:0666777888 --> 666777888
对于国际号码,我希望:
- 例如:00034666777888 --> 0034666777888
但我的问题是,表达式不应该改变正确的国际号码(以 00 开头)
- 例如:0034666777888 --> 0034666777888
始终有效的规则是:如果字符串以 1 或 3 '0' 开头,则删除第一个 '0' 否则保持字符串原样。
我必须清理正则表达式电话号码。有时我会得到以 0 开头的电话号码,在这种情况下,我不想保留链的其余部分:
对于国际号码,我希望:
但我的问题是,表达式不应该改变正确的国际号码(以 00 开头)
始终有效的规则是:如果字符串以 1 或 3 '0' 开头,则删除第一个 '0' 否则保持字符串原样。
用作^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'
如果您使用的语言支持负前瞻,则可以使用此正则表达式:
^(?!00[1-9])0
并无所取代。
根据评论,要删除引号(如果存在),您可以使用:
^"?(?:(?!00[1-9])0([0-9]+)|(00[0-9]+))"?$
并替换为$1$2
. (或\1\2
取决于语言/引擎)
^ // 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
爪哇版:
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
我认为这个正则表达式应该可以帮助你:
(?=0*)(00)*([1-9][\d]*)
将匹配替换为:\1\2