正则表达式,带汉字和全/半宽角色

Bra*_*non 5 java regex chinese-locale

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

"身份证地址应包含不少于八(≥8)个汉字(不包括全宽/半宽符号)."

我无法理解如何解决这个问题.

我已经达到了可以验证中文字符但无法排除所有全宽/半宽符号的程度.

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

结果应该是这样的

  • 名字名字名字名字= true
  • 名字名字名字名(字)=真
  • 名字名字名(字)= false
  • 名字名字名(字)= false

有人有建议吗?

nha*_*tdh 6

假设要检查字符串中有8个或更多汉字:

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

由于目前还不清楚是什么,你认为中国人的性格,我使用汉文字作为一种近似。根据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
Run Code Online (Sandbox Code Playgroud)

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

特别是,\p{sc=Han}在 Oracle 的实现中包括以下范围:

  • U+2E80 - U+2FEF:CJK 部首补充(整块)、康熙部首(整块)和未分配块的 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 平面,加上标签块中的一个保留代码点。