【问题标题】:How can I tell if a string has any non-ASCII characters in it?如何判断字符串中是否包含任何非 ASCII 字符?
【发布时间】:2012-11-11 10:43:16
【问题描述】:

我希望检测电子邮件地址中的国际化域名和本地部分,并想知道是否有一种使用正则表达式或其他 Javascript 的快速简便的方法来执行此操作。

【问题讨论】:

  • ASCII 是什么意思?请记住,NUL (\0)、BEL (\7 - 导致 PC 发出哔哔声)、ESC (\033) 也是有效的 ASCII 字符,但大多数人不会认为它们是有效的 ASCII 文本。
  • @slebetman 非常公平的补充。

标签: javascript regex unicode ascii


【解决方案1】:

应该这样做...

var hasMoreThanAscii = /^[\u0000-\u007f]*$/.test(str);

...还有...

var hasMoreThanAscii = str
                       .split("")
                       .some(function(char) { return char.charCodeAt(0) > 127 });

ES6 天哪...

let hasMoreThanAscii = [...str].some(char => char.charCodeAt(0) > 127);

【讨论】:

  • + 不应该是* 吗?这要求字符串中包含字符,但空字符串 "" 满足 OP 的严格要求:其中没有任何非 ASCII 字符。
  • 如果你把.filter改成.some,就可以去掉.length > 0
  • @user1689607 是的。我还将摆脱一些浏览器支持;)
  • 不,任何支持.filter()的浏览器都支持.some()。它们都是 ES5 的补充。 :)
  • 变量名倒置。 /^[\u0000-\u007f]*$/.test(str) = true 当 ascii 所以变量名应该是: var isAscii = /^[\u0000-\u007f]*$/.test(str)
【解决方案2】:

试试这个正则表达式。它测试字符串中所有 具有某种意义的 ascii 字符,从空格 32 到波浪号 126

var ascii = /^[ -~]+$/;

if ( !ascii.test( str ) ) {
  // string has non-ascii characters
}

编辑:带有制表符和换行符:

/^[ -~\t\n\r]+$/;

【讨论】:

  • 所以制表符和换行符不算是 OK 字符?
  • @JonathanLeffler:对...我也添加了那个案例。
  • @elclanrs 不过,我很高兴你有所区别,因为对于许多用例来说,它们是不受欢迎的。
  • 所有 Ascii 字符都有含义,但并非所有字符都允许或适用于特定上下文。变量名ascii 在这里会产生误导。
【解决方案3】:

charCodeAt可用于获取字符串中某个位置的字符代码。

function isAsciiOnly(str) {
    for (var i = 0; i < str.length; i++)
        if (str.charCodeAt(i) > 127)
            return false;
    return true;
}

【讨论】:

  • 最大的ASCII字符不是127吗?
  • 我相信现在最大的 ASCII 码是 255 在这里查看ascii-code.com
【解决方案4】:

@alex's solution 的更简单替代方案:

const hasNonAsciiCharacters = str => /[^\u0000-\u007f]/.test(str);

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2021-02-07
    • 2017-10-15
    • 2011-02-05
    相关资源
    最近更新 更多