1

最后,我需要一个正则表达式,它基本上将我的电话号码转换为 E164 符合号码。至于现在我得到了这个:

result = s.replaceAll("[(*)|+| ]", "");

它可以很好地替换所有内容:空格、“+”符号以及大括号“()”。但它与大括号的内容不匹配,因此例如数字+49 (0)11 111 11 11将被替换为49111111111

我怎样才能让它工作?

4

4 回答 4

4

你可以这样做,但是如果括号之间的不仅仅是一个零怎么办?

result = s.replaceAll("\\([^()]*\\)|[*+ ]+", "");

作为一个冗长的正则表达式:

result = s.replaceAll(
    "(?x)     # Allow comments in the regex.                     \n" +
    "\\(      # Either match a (                                 \n" +
    "[^()]*   # then any number of characters except parentheses \n" +
    "\\)      # then a ).                                        \n" +
    "|        # Or                                               \n" +
    "[*+\\ ]+ # Match one or more asterisks, pluses or spaces", "");
于 2012-12-06T21:20:45.670 回答
3
[(*)|+| ]

是一个字符类,匹配任何单个括号、星号、条形、加号或空格字符。摆脱方括号并使用类似的东西

s.replaceAll("\\(.*?\\)|\\D", "");

这将删除(包括)括号之间的任何内容,以及任何其他不是数字的内容。请注意,这不会很好地处理嵌套括号 - 它会吃掉从左括号到找到的第一个右括号的所有内容,因此会(123(45)67)变成67(不平衡的右括号被删除,因为它是 a \D

于 2012-12-06T21:22:31.147 回答
0

我认为您对角色类的魔力期望过高。首先,在字符类中,不要使用|. 它只是字符类将匹配的另一个字符。只需列出您想要包含的所有字符,而无需任何分隔符。

其次,字符类实际上只匹配单个字符。因此(*),根据定义,在字符类内部只能做 remove (, or *(字面意思) or )。如果您 100% 确定您的输入永远不会有嵌套括号或不匹配的括号或其他内容,那么您可以执行以下操作:

"(?:\\([^)]\\)|\\D)+"
于 2012-12-06T21:23:23.240 回答
0

你可以试试这个:"(\\(\\d+\\))|\\+|\\s"。删除括号和内容、加号和空格。

于 2012-12-06T21:26:44.730 回答