替换括号内的所有内容?

时间:2012-12-06 21:16:14

标签: java regex replaceall

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

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

它取代了一切:空格,“+” - 符号以及大括号“()”。但它与其大括号的内容不匹配,因此例如号码+49 (0)11 111 11 11将替换为49111111111

我怎样才能让它发挥作用?

4 个答案:

答案 0 :(得分: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", "");

答案 1 :(得分:3)

[(*)|+| ]

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

之类的东西
s.replaceAll("\\(.*?\\)|\\D", "");

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

答案 2 :(得分:0)

我认为你期待来自character classes的太多魔法。首先,在字符类中,不要使用|。它只是另一个将由角色类匹配的角色。只需列出您想要包含的所有字符,而无需任何分隔符。

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

"(?:\\([^)]\\)|\\D)+"

答案 3 :(得分:0)

您可以尝试这样做:"(\\(\\d+\\))|\\+|\\s"。删除paren和内容,加号和空格。