【问题标题】:How to approximate Java's Character.isLetterOrDigit() to identify non-English letters, digits in Javascript?如何近似 Java 的 Character.isLetterOrDigit() 以识别 Javascript 中的非英文字母、数字?
【发布时间】:2010-09-03 20:14:27
【问题描述】:

在 Javascript 中,有没有办法(在国际化中幸存下来)确定一个字符是字母还是数字?这将正确地将 Ä、ç 识别为字母和非英语数字(我不打算将其作为示例查找)!

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

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

因为它会拾取非英文字母。我认为 C# 也有类似的能力...

当然,最坏的情况是我可以将字符串发送回服务器进行检查,但这很痛苦......

当然,最后我希望检查输入是否为有效名称(以字母开头,其余为字母或数字)。低容量使用的开箱即用可能性可能是:

var validName=function(atr) {
    var ele=document.createElement("div");
    try { ele.setAttribute(atr,"xxx"); }
    catch(e) { return false; }
    return true;
    }

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

【问题讨论】:

  • 遗憾的是,Javascript regex /w(匹配单词字符)认为 Ä 是非单词字符。至少在 Chrome 和 FF 中
  • 这个相关问题stackoverflow.com/questions/1073412/… 似乎表明除了尝试列出您要假装不是数字和字母的字符之外,没有真正的解决方案......我希望有人知道得更好!
  • “非英文数字”应该包括什么?

标签: javascript regex internationalization


【解决方案1】:

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

CharFunk:https://github.com/joelarson4/CharFunk

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

【讨论】:

  • 我冒昧地将您的源代码粘贴到您的答案中,因为这方式让我(可能还有其他人)更容易查看它。我希望你不要介意。顺便说一句,看起来不错,但我认为这可以更优化。如果我找到更有效的算法,我会告诉你的。
  • 我确信这不是最佳解决方案,但她有效!
【解决方案2】:

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

我不完全确定我是否指向正确的方向。有一堆Unicode code charts 可能会有所帮助,当然还有unicode standard 本身。不过,这一切都需要阅读和理解,特别是如果您的唯一目标是进行一些 javascript 字符串验证。

【讨论】:

  • 我朝这个方向看。我认为最简单的实现方法可能是编写一个 Java 程序,该程序将循环遍历代码点并输出每种类型(字母、数字或两者都不是)的所有代码点范围的列表。看起来这些范围非常小,我最终得到了 590 个单独的范围,用于 0 到 65535 之间的字符。当然,我也不确定 Javascript 代码点是否会 100% 与 Java 中的内容匹配,具体取决于浏览器,系统设置等等……i18n是个深坑!
  • @larson4 啊,我希望我能想到这一点。代码点是实际的 unicode 代码点(独立于编码)AFAIK,因此它们应该可以正常工作。
猜你喜欢
  • 2020-06-14
  • 2017-10-21
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多