如何近似Java';s Character.isleterOrdigit()来标识Javascript中的非英语字母、数字?

如何近似Java';s Character.isleterOrdigit()来标识Javascript中的非英语字母、数字?,javascript,regex,internationalization,Javascript,Regex,Internationalization,在Javascript中,是否有一种方法(在国际化后仍然有效)来确定字符是字母还是数字?这将正确地将Ä、ç识别为字母和非英语数字(我不打算将其作为示例查找) 在Java中,Character类有一些静态方法.isLetter(),.isDigit(),.isLetterOrDigit(),用于以国际通用的方式确定字符实际上是字母或数字。这比像这样的代码要好 //this is not right, but common and easy if((ch>='A'&&ch<

在Javascript中,是否有一种方法(在国际化后仍然有效)来确定字符是字母还是数字?这将正确地将Ä、ç识别为字母和非英语数字(我不打算将其作为示例查找)

在Java中,Character类有一些静态方法.isLetter(),.isDigit(),.isLetterOrDigit(),用于以国际通用的方式确定字符实际上是字母或数字。这比像这样的代码要好

//this is not right, but common and easy
if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')) { //it's a letter

这在IE、FF和Chrome中测试得相当不错。。。尽管可能需要进行彻底的测试,以确定答案的一致性。同样,由于元素创建的原因,不适合重载使用。

据我所知,当遇到类似问题时,唯一的方法就是选择几个块并假设它们是字母。unicode标准有完整的列表,因此您可以为此构建一个完整的正则表达式(我认为)。例如,如果你按照字母顺序选择所有的字符,那么你可能拥有所有的字母字符。中的数字(十进制、数字、数字)也是如此


我不完全确定我指的方向是否正确。有很多可能会有帮助,当然还有它本身。不过,阅读和理解这些都有点困难,特别是当您的唯一目标是进行一些javascript字符串验证时。

我创建了一个小型javascript实用程序来提供此功能。我不认为它是完美的,所以让我知道你如何公平。如果人们喜欢,我会把它作为这个问题的正式答案

查芬克:

  • getDirectionality(ch)-用于查找角色的方向性
  • isAllLettersOrDigits(string)-如果string参数由所有字母和数字组成,则返回true
  • isDigit(ch)-如果提供长度为1的数字字符串,则返回true
  • isLetter(ch)-如果提供长度为1的字符串,即字母,则返回true
  • 如果提供了Unicode“Nl”类别中的长度为1的字符串,则返回true
  • 如果提供了长度为1的字符串,即字母或数字,则返回true
  • isLowerCase(ch)-如果提供长度为1的小写字符串,则返回true
  • isMirrored(ch)-如果提供长度为1的镜像字符字符串,则返回true
  • isUpperCase(ch)-如果提供长度为1的大写字符串,则返回true
  • isValidFirstForName(ch)-如果提供了长度为1的字符串,该字符串是JavaScript标识符的有效前导字符,则返回true
  • isValidMidForName(ch)-如果提供的长度为1的字符串是ECMAScript标识符的有效非前导字符,则返回true
  • isValidName(string,checkReserved)-如果字符串是有效的ECMAScript标识符,则返回true
  • isWhitespace(ch)-如果提供长度为1的字符串作为空白字符,则返回true
  • indexOf(string,callback)-返回第一个匹配的索引,该索引从回调返回一个真正的返回值
  • lastIndexOf(字符串,回调)-返回最后一个匹配的索引,该索引返回回调的真实返回值
  • matchesAll(string,callback)-如果提供的字符串中的所有字符都导致回调返回true,则返回true
  • replaceMatches(string,callback,ch)-返回一个新字符串,替换所有匹配的字符

遗憾的是,Javascript regex/w(匹配单词字符)认为Ä是非单词字符。至少在Chrome和FF中,这个相关的问题似乎表明,除了试图列出你要假装不是数字和字母的字符外,没有真正的解决方案。。。我希望有人知道得更清楚!“非英语数字”应该包括什么?我朝这个方向看。我认为最简单的实现方法可能是编写一个Java程序,在代码点之间循环,并输出每种类型(字母、数字或两者都不)的所有代码点范围的列表。但这些范围似乎非常小,我最终得到了590个单独的范围,用于0到65535之间的字符。当然,我也不确定Javascript代码点是否与Java中的代码点100%匹配,具体取决于浏览器、系统设置等。。。i18n是一个深坑@拉尔森:啊,我希望我能想到这一点。代码点是实际的unicode代码点(独立于编码的)AFAIK,因此它们应该可以正常工作。我冒昧地将您的源代码粘贴到您的答案中,因为这对我(可能还有其他人)查看它更容易。我希望你不介意。顺便说一句,看起来不错,但我认为这可以更优化。如果我找到了一个更有效的算法,我会告诉你的。我相信这不是最理想的解决方案,但她很管用!
var validName=function(atr) {
    var ele=document.createElement("div");
    try { ele.setAttribute(atr,"xxx"); }
    catch(e) { return false; }
    return true;
    }