JavaScript正则表达式捕捉汉字

时间:2011-09-08 07:57:59

标签: javascript regex unicode

我无法让这个javascript函数以我想要的方式工作......

//匹配包含汉字和/或假名字符的字符串

String.prototype.isKanjiKana = function(){
    return !!this.match(/^[\u4E00-\u9FAF|\u3040-\u3096|\u30A1-\u30FA|\uFF66-\uFF9D|\u31F0-\u31FF]+$/);
}

如果字符串由汉字和/或假名字符组成,则返回TRUE;如果字母或其他字符存在,则返回FALSE。

如果至少存在1个汉字和/或假名字符,我希望它返回,如果所有字符都存在的话。

提前感谢您的帮助!

6 个答案:

答案 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]