【问题标题】:Java regex to distinguish special characters while allowing non english charsJava 正则表达式来区分特殊字符,同时允许非英文字符
【发布时间】:2012-07-19 02:03:17
【问题描述】:

我正在尝试执行上述操作。一种选择是获取一组特殊字符,然后使用一些 java 逻辑我们可以完成此操作。但是我必须确保我包含所有特殊字符。

有没有更好的方法?

【问题讨论】:

  • 不清楚你想要完成什么。你能提供一些例子吗?
  • java.lang.Character 中有各种 API,例如 isLetter(char)isWhitespace(char)。你能用这些结构表达你想做什么吗?如果是这样,关于翻译成正则表达式的对话会更有效率。
  • 所以假设我正在验证输入。如果我们丢弃非英文字符,我可以验证来自 ([a-zA-Z0-9]) 等正则表达式的特殊字符。因此,当输入是上面逻辑的非英文字符时,将其视为特殊字符,因为它与正则表达式不匹配。

标签: java regex special-characters


【解决方案1】:

您需要确定什么是特殊字符。可能感兴趣的一种方法是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 块或一般类别的一部分,因此在编写代码时需要牢记这一点。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 但是当你得到一些非英文字符时,它也会说假。我希望允许这样做。
    • 您确定您处理的是正确的 Unicode 字符串吗?您可能将 UTF-8 字符串错误地转换为字节/ASCII。这也会导致 Regex 匹配 UTF-8 控制序列字符(请参阅en.wikipedia.org/wiki/UTF-8#Description)。
    猜你喜欢
    • 1970-01-01
    • 2017-08-15
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    相关资源
    最近更新 更多