我需要用Java替换字符串中的所有特殊控制字符。
我想询问Google maps API v3,Google似乎并不喜欢这些字符。
示例:http://www.google.com/maps/api/geocode/json?sensor=false&address=NEW%20YORK%C2%8F
此网址包含以下字符:http://www.fileformat.info/info/unicode/char/008f/index.htm
所以我收到了一些数据,我需要对这些数据进行地理编码。我知道某些角色不会通过地理编码,但我不知道确切的列表。
我无法找到有关此问题的任何文档,因此我认为Google不喜欢的字符列表是这样的: http://www.fileformat.info/info/unicode/category/Cc/list.htm
是否有任何已构建的函数可以摆脱这些字符,或者我是否需要构建一个新的函数,并逐个替换?
或者有一个很好的正则表达式来完成这项工作吗?
有人知道谷歌不喜欢哪个角色列表?
编辑:Google已为此创建了一个网页:
https://developers.google.com/maps/documentation/webservices/?hl=fr#BuildingURLs
答案 0 :(得分:10)
如果要删除Other / Control Unicode类别中的所有字符,可以执行以下操作:
System.out.println(
"a\u0000b\u0007c\u008fd".replaceAll("\\p{Cc}", "")
); // abcd
请注意,这实际上会从字符串中移除(以及其他)'\u008f'
Unicode字符,而不是转义形式的"%8F"
字符串。
如果一个Unicode块/类别没有很好地捕获黑名单,那么Java确实有一个强大的字符类算术,它可以使用交集,减法等。或者,您也可以使用否定的白名单方法,即不是明确指定哪些字符是非法的,而是指定合法的内容,然后其他所有内容都变为非法。
这是一个减法示例:
System.out.println(
"regular expressions: now you have two problems!!"
.replaceAll("[a-z&&[^aeiou]]", "_")
);
// _e_u_a_ e___e__io__: _o_ _ou _a_e __o __o__e__!!
[…]
是character class。像[aeiou]
这样的东西匹配任何一个小写元音。 [^…]
是否定的字符类。 [^aeiou]
与除了小写元音之外的任何内容匹配。
[a-z&&[^aeiou]]
匹配[a-z]
减去[aeiou]
,即所有小写辅音。
下一个示例显示了否定的白名单方法:
System.out.println(
"regular expressions: now you have two problems!!"
.replaceAll("[^a-z]", "_")
);
// regular_expressions__now_you_have_two_problems__
只有小写字母a-z
才合法;其他一切都是非法的。