我正在为一个Java项目做验证规则,我得到的要求之一是:



我无法解决这个问题。

我已经到了可以验证中文字符但不能排除所有全角/半角符号的地步。

return Pattern.matches("^[\\p{IsHan}]{8,}$", address);

结果应该是这样的
  • 名字名字名字名字= true
  • 名字名字名字(字)= true
  • 名字名字名(字)= false
  • 名字名字名(字)= false

  • 有人有建议吗?

    最佳答案

    假设您要检查字符串中是否包含8个或更多中文字符:

    Pattern.compile("^(\\P{sc=Han}*\\p{sc=Han}){8}.*$", Pattern.DOTALL);
    

    由于您不清楚汉字是什么,因此我使用Han script作为近似值。根据Unicode 6.2.0,汉脚本定义为包含以下代码点:
    2E80..2E99    ; Han # So  [26] CJK RADICAL REPEAT..CJK RADICAL RAP
    2E9B..2EF3    ; Han # So  [89] CJK RADICAL CHOKE..CJK RADICAL C-SIMPLIFIED TURTLE
    2F00..2FD5    ; Han # So [214] KANGXI RADICAL ONE..KANGXI RADICAL FLUTE
    3005          ; Han # Lm       IDEOGRAPHIC ITERATION MARK
    3007          ; Han # Nl       IDEOGRAPHIC NUMBER ZERO
    3021..3029    ; Han # Nl   [9] HANGZHOU NUMERAL ONE..HANGZHOU NUMERAL NINE
    3038..303A    ; Han # Nl   [3] HANGZHOU NUMERAL TEN..HANGZHOU NUMERAL THIRTY
    303B          ; Han # Lm       VERTICAL IDEOGRAPHIC ITERATION MARK
    3400..4DB5    ; Han # Lo [6582] CJK UNIFIED IDEOGRAPH-3400..CJK UNIFIED IDEOGRAPH-4DB5
    4E00..9FCC    ; Han # Lo [20941] CJK UNIFIED IDEOGRAPH-4E00..CJK UNIFIED IDEOGRAPH-9FCC
    F900..FA6D    ; Han # Lo [366] CJK COMPATIBILITY IDEOGRAPH-F900..CJK COMPATIBILITY IDEOGRAPH-FA6D
    FA70..FAD9    ; Han # Lo [106] CJK COMPATIBILITY IDEOGRAPH-FA70..CJK COMPATIBILITY IDEOGRAPH-FAD9
    20000..2A6D6  ; Han # Lo [42711] CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6
    2A700..2B734  ; Han # Lo [4149] CJK UNIFIED IDEOGRAPH-2A700..CJK UNIFIED IDEOGRAPH-2B734
    2B740..2B81D  ; Han # Lo [222] CJK UNIFIED IDEOGRAPH-2B740..CJK UNIFIED IDEOGRAPH-2B81D
    2F800..2FA1D  ; Han # Lo [542] CJK COMPATIBILITY IDEOGRAPH-2F800..CJK COMPATIBILITY IDEOGRAPH-2FA1D
    

    Java 8 is using Unicode 6.2.0,因此\p{sc=Han}与上面列出的代码点匹配。但是,该实现还包括未分配的代码点(在已分配的块中)和未分配的块,因此请注意将JRE升级到最新的主要版本,以确保随着将更多字符添加到Unicode中,程序可以正确运行。

    特别是,Oracle实现中的\p{sc=Han}包括以下范围:
  • U + 2E80-U + 2FEF:CJK部首补编(整个block),康熙部首(整块)和未分配块中的16个代码点。
  • U + 3005,U + 3007,U + 3021-U + 3029,U + 3038-U + 303B:CJK符号和标点符号(块中的某些字符)
  • U + 3400-U + 4DBF:CJK统一表意文字扩展A(整个模块)
  • U + 4E00-U + 9FFF:CJK统一表意文字(整块)
  • U + F900-U + FAFF:CJK兼容性表意文字(整块)
  • U + 20000-U + E0000:CJK统一象形文字扩展B/C/D/E(整个块),CJK兼容性象形文字补充(整个块)和几个未分配的Unicode平面,以及“标记”块中的一个保留代码点。
  • 10-04 18:59