2012-07-18 114 views
0

我想要做到以上。一种选择是获得一组特殊字符的字符,然后用一些java逻辑我们可以完成这一点。但是,我必须确保包含所有特殊字符。Java正则表达式来区分特殊字符,同时允许非英文字符

有没有更好的方法来做到这一点?

+1

目前还不清楚你想完成什么。你能提供一些例子吗? – 2012-07-18 17:12:36

+2

像'isLetter(char)'和'isWhitespace(char)'这样''java.lang.Character'中有各种各样的API。你能用这些结构表达你想要做什么吗?如果是这样,关于翻译成正则表达式的谈话会更有效率。 – 2012-07-18 17:24:05

+0

因此,假设我正在验证输入。如果我们丢弃非英文字符,我可以验证正则表达式中的特殊字符,如([a-zA-Z0-9])。所以当输入是非英文字符时,逻辑认为它是一个特殊字符,因为它与正则表达式不匹配。 – 2012-07-18 17:33:51

回答

0

您需要决定什么构成特殊字符。一种可能感兴趣的方法是Character.getType(char),它返回一个int,它将匹配Character的常量值之一,例如Character.LOWERCASE_LETTER或Character.CURRENCY_SYMBOL。这可以让你确定一个字符的一般类别,然后你需要决定哪些类别被视为“特殊”字符,以及哪些你将接受作为文本的一部分。

请注意,Java使用UTF-16对其char和String值进行编码,因此您可能需要处理补充字符(请参阅getType方法说明中的链接)。这是一个讨厌的问题,但Character方法确实提供了一些方法,可以帮助您检测这种情况并解决此问题。请参阅Character.isSupplementaryCodepoint(int)Character.codepointAt(char[], int)方法。

另外请注意,Java 6对Unicode的了解程度要远远低于Java 7.最新版本的Java在其Unicode数据库中增加了更多,但在Java 6上运行的代码不会识别某些(实际上相当多)作为Unicode块或一般类别的一部分的异常码点,因此编写代码时需要记住这一点。

0

这听起来像你想从一个Unicode字符串中删除所有控制字符。您可以通过在正则表达式中使用Unicode字符类别标识符来完成此操作。 “Cc”类别包含这些字符,请参阅http://www.fileformat.info/info/unicode/category/Cc/list.htm

myString = myString.replaceAll("[\p{Cc}]+", ""); 
+0

但是,当你给一些非英文字符时,它也表示错误。我希望这被允许。 – 2012-07-19 05:07:29

+0

你确定你正在处理一个正确的Unicode字符串吗?您可能会将UTF-8字符串错误地转换为字节/ ASCII。这也会导致正则表达式匹配UTF-8控制序列字符(参见http://en.wikipedia.org/wiki/UTF-8#Description)。 – 2012-07-19 06:56:24

相关问题