最后,我需要一个正则表达式,它基本上将我的电话号码转换为 E164 符合号码。至于现在我得到了这个:
result = s.replaceAll("[(*)|+| ]", "");
它可以很好地替换所有内容:空格、“+”符号以及大括号“()”。但它与大括号的内容不匹配,因此例如数字+49 (0)11 111 11 11
将被替换为49111111111
。
我怎样才能让它工作?
最后,我需要一个正则表达式,它基本上将我的电话号码转换为 E164 符合号码。至于现在我得到了这个:
result = s.replaceAll("[(*)|+| ]", "");
它可以很好地替换所有内容:空格、“+”符号以及大括号“()”。但它与大括号的内容不匹配,因此例如数字+49 (0)11 111 11 11
将被替换为49111111111
。
我怎样才能让它工作?
你可以这样做,但是如果括号之间的不仅仅是一个零怎么办?
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", "");
[(*)|+| ]
是一个字符类,匹配任何单个括号、星号、条形、加号或空格字符。摆脱方括号并使用类似的东西
s.replaceAll("\\(.*?\\)|\\D", "");
这将删除(包括)括号之间的任何内容,以及任何其他不是数字的内容。请注意,这不会很好地处理嵌套括号 - 它会吃掉从左括号到找到的第一个右括号的所有内容,因此会(123(45)67)
变成67
(不平衡的右括号被删除,因为它是 a \D
)
我认为您对角色类的魔力期望过高。首先,在字符类中,不要使用|
. 它只是字符类将匹配的另一个字符。只需列出您想要包含的所有字符,而无需任何分隔符。
其次,字符类实际上只匹配单个字符。因此(*)
,根据定义,在字符类内部只能做 remove (
, or *
(字面意思) or )
。如果您 100% 确定您的输入永远不会有嵌套括号或不匹配的括号或其他内容,那么您可以执行以下操作:
"(?:\\([^)]\\)|\\D)+"
你可以试试这个:"(\\(\\d+\\))|\\+|\\s"
。删除括号和内容、加号和空格。