我无法让这个javascript函数以我想要的方式工作......
//匹配包含汉字和/或假名字符的字符串
String.prototype.isKanjiKana = function(){
return !!this.match(/^[\u4E00-\u9FAF|\u3040-\u3096|\u30A1-\u30FA|\uFF66-\uFF9D|\u31F0-\u31FF]+$/);
}
如果字符串由汉字和/或假名字符组成,则返回TRUE;如果字母或其他字符存在,则返回FALSE。
如果至少存在1个汉字和/或假名字符,我希望它返回,如果所有字符都存在的话。
提前感谢您的帮助!
答案 0 :(得分:6)
正确答案是不到硬编码范围。永远不要在你的代码中加入魔术数字!那是一场维护噩梦。它难以阅读,难以编写,难以调试,难以维护。你怎么知道你的数字是正确的?当他们添加新的时会发生什么?不,不要使用魔术数字。请。
正确的答案是使用命名的Unicode脚本,这是每个Unicode代码点的基本方面:
[\p{Han}\p{Hiragana}\p{Katakana}]
这需要XRegExp
plugin用于Javascript。
真正的问题是Javascript正则表达式本身太原始以支持Unicode属性 - 因此,支持Unicode。也许这在15年前曾经是一个可以接受的妥协,但今天它正如你自己所发现的那样无可挽回地疏忽。
您还会错过新Common
属性中指定为假名的几个Script Extensions
代码点,但可能无关紧要。您只需将\p{Common}
添加到上面的设置中即可。
答案 1 :(得分:2)
String.prototype.isKanjiKana = function(){
return !!this.match(/[\u4E00-\u9FAF\u3040-\u3096\u30A1-\u30FA\uFF66-\uFF9D\u31F0-\u31FF]/);
}
请勿使用$^
将其锚定到字符串的开头和结尾,在这种情况下+
无用。
答案 2 :(得分:1)
/[\u4E00-\u9FAF|\u3040-\u3096|\u30A1-\u30FA|\uFF66-\uFF9D|\u31F0-\u31FF]/
答案 3 :(得分:1)
为什么不只是这个?当它包含至少一个汉字时,它将返回 true。
/[一-龯]/.test(str)
答案 4 :(得分:0)
现在Unicode属性转义是ES(2018)规范的一部分,如果JS引擎支持此功能,则可以在本地使用以下正则表达式(扩展@tchrist的答案):
/[\p{Script_Extensions=Han}\p{Script_Extensions=Hiragana}\p{Script_Extensions=Katakana}]/u
答案 5 :(得分:0)
/[\u3000-\u303f]|[\u3040-\u309f]|[\u30a0-\u30ff]|[\uff00-\uffef]|[\u4e00-\u9faf]|[\u3400-\u4dbf]/
[\u3000-\u303f]
[\u3040-\u309f]
[\u30a0-\u30ff]
[\uff00-\uffef]
[\u4e00-\u9faf]|[\u3400-\u4dbf]