最后我需要一个正则表达式,它基本上将我的电话号码转换为E164符合号码。至于现在我得到了这个:
result = s.replaceAll("[(*)|+| ]", "");
它取代了一切:空格,“+” - 符号以及大括号“()”。但它与其大括号的内容不匹配,因此例如号码+49 (0)11 111 11 11
将替换为49111111111
。
我怎样才能让它发挥作用?
答案 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和内容,加号和空格。