JavaScript中所有可打印字符的正则表达式

JavaScript中所有可打印字符的正则表达式,javascript,regex,Javascript,Regex,寻找验证所有可打印字符的正则表达式。正则表达式只需要在JavaScript中使用。我看过这篇文章,但它主要讨论.net、Java和C,而不是JavaScript 您必须只允许这些可打印字符: a-z,a-z,0-9和三十二个符号:!“#$%&'()*+,-./:;?@[]^{124;}和空格 需要一个JavaScript正则表达式来验证上述输入字符之一,并放弃其余字符。如果您想匹配UTF-8集合中的所有可打印字符(如8月21日的评论所示),您自己将很难做到这一点。JavaScript的原生正则表

寻找验证所有可打印字符的正则表达式。正则表达式只需要在JavaScript中使用。我看过这篇文章,但它主要讨论.net、Java和C,而不是JavaScript

您必须只允许这些可打印字符:

a-z,a-z,0-9和三十二个符号:!“#$%&'()*+,-./:;?@[]^{124;}和空格


需要一个JavaScript正则表达式来验证上述输入字符之一,并放弃其余字符。

如果您想匹配UTF-8集合中的所有可打印字符(如8月21日的评论所示),您自己将很难做到这一点。JavaScript的原生正则表达式对Unicode的支持非常糟糕。但是您可以使用正则表达式
^\P{C}*$

如果您只想将编辑中提到的几个ASCII字母与8月22日发布的文章进行匹配,那么正则表达式很简单:

/^[a-z0-9!"#$%&'()*+,.\/:;<=>?@\[\] ^_`{|}~-]*$/i
/^[a-z0-9!”#$%&'()*+,.\/:;?\[\]^{{124;}-]*$/i

对于非unicode,请使用正则表达式模式
^[^\x00-\x1F\x80-\x9F]+$


如果要使用unicode,请先阅读

然后我建议使用regex模式
^[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}]*$

  • \p{Cc}
    \p{Control}
    :ASCII 0x00..0x1F或拉丁文-1 0x80..0x9F控制字符
  • \p{Cf}
    \p{Format}
    :不可见的格式指示符
  • \p{Zl}
    \p{Line\U Separator}
    :行分隔符字符U+2028
  • \p{Zp}
    \p{paragration_Separator}
    :段落分隔符字符U+2029

有关更多信息,请参见

自发布此问题以来,JavaScript似乎发生了某种程度的变化

我用的是这个:

var regex = /^[\u0020-\u007e\u00a0-\u00ff]*$/;
console.log( regex.test("!\"#$%&'()*+,-./:;<=>?@[] ^_`{|}~")); //should output "true" 
console.log( regex.test("Iñtërnâtiônàlizætiøn")); //should output "true"
console.log( regex.test("☃To validate a string only consists of printable ASCII characters, use a simple regex like

/^[ -~]+$/
var regex=/^[\u0020-\u007e\u00a0-\u00ff]*$/;
console.log(regex.test(“!\”\$%和“()*+,-./:;?@[]^ `{124;}~”);//应输出“true”
log(regex.test(“Iñtërn–tiênálizætiên”);//应该输出“true”

console.log(regex.test(“☃ 要验证仅由可打印ASCII字符组成的字符串,请使用简单的正则表达式,如

^\PC+$
相配

  • ^
    -字符串锚的开始
  • [-~]+
    -一个或多个(由于
    +
    量词)字符在ASCII表格中从空格到波浪号的范围内:

-
$
-字符串结束锚定

对于Unicode可打印字符,请使用Unicode类别(匹配除控制字符以外的任何字符),如前所述:

见regex演示:

//仅限ASCII码
变量ascii_print_rx=/^[-~]+$/;
console.log(ascii_print_rx.test(“没问题”);//true
console.log(ascii\u print\u rx.test('\f'));//false,\f是ascii表单提要字符
console.log(ascii_print_rx.test(“demásiado tarde”);//false,不支持Unicode可打印字符
//Unicode支持
log(XRegExp.test('demásiado tarde',XRegExp(“^\\PC+$”));//true
console.log(XRegExp.test)‌ ', XRegExp(“^\\PC+$”);//false,\u200C是Unicode零宽度连接符
console.log(XRegExp.test('\f',XRegExp(“^\\PC+$”));//false,\f是ASCII表单提要字符
TLDR答案 使用
string1.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu)
作为条件,真正的意思是
string1
包含任何无法打印的字符

或者,如果需要逻辑等价项,
string1.match(/^[\p{Cc}\p{Cn}\p{Cs}]+$/gu)
作为条件,如果
string1
仅包含可打印字符,则返回true

TLDR解释
  • \P{Cc}
    :与控制字符不匹配
  • \P{Cn}
    :不匹配未分配的字符
  • \P{Cs}
    :与UTF-8无效字符不匹配
  • >代码> +/>代码:确保找到了一些东西,即,这也意味着<>代码> ,空白字符串,将不被认为是可打印的。
  • /g
    :贪婪匹配,彻底/贪婪地在字符串中搜索指定的字符集
  • /u
    :用于在unicode字符点上进行匹配的unicode正则表达式运算符。(来源:)
演示
var string1='此字符串包含无法打印的字符\u0001';
if(string1.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu)){
log(“不可打印字符串:+string1”);
}
var string2='此字符串只有可打印字符';
if(string2.match(/^[\P{Cc}\P{Cn}\P{Cs}]+$/gu)){
log(“可打印字符串:+string2”);

}
All?你确定吗?你知道有多少unicode字符吗?不幸的是javascript不支持unicode字符类:unicode UTF-16有一些2^16,我猜。@AurA:甚至还不太接近。在进一步探讨这个问题之前,你肯定需要阅读Joel的。我想这是一个很好的解决方案,但假设我想要printabl仅适用于UTF-8的e字符,您能在不使用任何第三方JavaScript库的情况下给我一个正则表达式吗。@AurA:XRegExp编译为本机JavaScript。我已经知道,但我在这里有一个限制…我不能使用第三方库。这就是为什么我只要求UTF-8,这将减少DRA中的字符数UTF-8的字符数与UTF-16和UTF-32的字符数完全相同。UTF-8只是一种编码——它包含所有的unicode——全部内容。你是说ASCII吗?在这些给定的字符中,我想检查输入的字符串是否有任何无法打印的字符,或者在按键时我想检查输入的字符是否正确是可打印的。我认为它应该是
\x20-\x7e
\x80-\xff
第一个选项很巧妙(除非我们需要Unicode)。您可以使用将其传输到ES5。