如何使用正则表达式验证中文输入?

8

问题是我需要在客户端验证中将这种类型的中文输入视为无效:

当任何英文字母混合任何中文字和空格时,总长度>=10时,输入无效。

例如:"你的a你的a你的a你" 或 "你的 你的 你的"(长度为10)是无效的。但是长度为9的"你的a你的a你的a"是可以的。

我使用JavaScript执行客户端验证,使用Java执行服务器端验证。所以我认为在两者上应用正则表达式应该是完美的。

有人能给出一些如何编写正则表达式规则的提示吗?


你的意思是什么,需要加空格吗?你已经尝试过什么了? - LF00
其他字符如ASCII呢? - LF00
1个回答

18

《Unicode中汉字的完整范围是什么?》得知,CJK Unicode 范围为:

Block                                   Range       Comment
--------------------------------------- ----------- ----------------------------------------------------
CJK Unified Ideographs                  4E00-9FFF   Common
CJK Unified Ideographs Extension A      3400-4DBF   Rare
CJK Unified Ideographs Extension B      20000-2A6DF Rare, historic
CJK Unified Ideographs Extension C      2A700–2B73F Rare, historic
CJK Unified Ideographs Extension D      2B740–2B81F Uncommon, some in current use
CJK Unified Ideographs Extension E      2B820–2CEAF Rare, historic
CJK Compatibility Ideographs            F900-FAFF   Duplicates, unifiable variants, corporate characters
CJK Compatibility Ideographs Supplement 2F800-2FA1F Unifiable variants
CJK Symbols and Punctuation             3000-303F

你可能希望允许使用Unicode块CJK统一汉字CJK统一汉字扩展A中的代码点。

这个正则表达式将匹配0到9个空格,表意空格(U+3000),A-Z字母或这2个CJK块中的代码点。

/^[ A-Za-z\u3000-\u303F\u3400-\u4DBF\u4E00-\u9FFF]{0,9}$/

不过,您也可以添加更多的块。


代码:

function has10OrLessCJK(text) {
    return /^[ A-Za-z\u3000-\u303F\u3400-\u4DBF\u4E00-\u9FFF]{0,9}$/.test(text);
}

function checkValidation(value) {
    var valid = document.getElementById("valid");
    if (has10OrLessCJK(value)) {
        valid.innerText = "Valid";
    } else {
        valid.innerText = "Invalid";
    }
}
<input type="text" 
       style="width:100%"
       oninput="checkValidation(this.value)"
       value="你的a你的a你的a">

<div id="valid">
    Valid
</div>


@jmli 我编辑了答案,包括 A-Z 和 a-z 的字母。现在注意到它将空字符串视为有效。此外,它不允许 0-9 数字或标点符号,例如 a!b-c(d)3(被视为无效)。 - Mariano
除了现有规则外,如果只考虑中文输入(不包含任何数字或英文字母)是否有效,那么使用正则表达式定义“或”检查是否可能? - jm li
我指的是纯中文,没有任何长度限制。 - jm li
@jmli Alternation: /patternA|patternB/... 例如:/^[ \u3000\u3400-\u4DBF\u4E00-\u9FFF]+$|^[ A-Za-z\u3000\u3400-\u4DBF\u4E00-\u9FFF]{0,9}$/ - Mariano
我建议将表格从本回答中删除,并在原始问题中引用它,因为已经更新,这里所代表的版本存在错误。 - Calion
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接