如何判断字符串中是不是包含任何非 ASCII 字符?
Posted
技术标签:
【中文标题】如何判断字符串中是不是包含任何非 ASCII 字符?【英文标题】: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 非常公平的补充。 【参考方案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);
【讨论】:
以上是关于如何判断字符串中是不是包含任何非 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章