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

时间:2012-08-21 10:19:52

标签: regex javascript-events javascript

查找正则表达式,验证所有可打印字符。正则表达式只需要在JavaScript中使用。我已经通过了this帖子,但它主要讨论的是.net,Java和C,但不是JavaScript。

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

az,AZ,0-9和32个符号:!“#$%&'()* +, - 。/ :;< =>?@ [] ^ _` {| }〜和空间

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

5 个答案:

答案 0 :(得分:14)

如果你想匹配UTF-8套装中的所有可打印字符(如8月21日的评论所示),你将很难自己做这件事。 JavaScript的本机正则表达式支持非常糟糕的Unicode。但您可以将XRegExp与正则表达式^\P{C}*$一起使用。

如果您只想将编辑中提到的那几个ASCII字母与8月22日的帖子相匹配,那么正则表达式是微不足道的:

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

答案 1 :(得分:11)

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


如果您想使用unicode,请先阅读Javascript + Unicode regexes

我建议使用正则表达式^[^\p{Cc}\p{Cf}\p{Zl}\p{Zp}]*$

  • \p{Cc}\p{Control}:ASCII 0x00..0x1F或Latin-1 0x80..0x9F控制字符。
  • \p{Cf}\p{Format}:隐形格式指示器。
  • \p{Zl}\p{Line_Separator}:行分隔符字符U + 2028。
  • \p{Zp}\p{Paragraph_Separator}:段落分隔符U + 2029。

有关详细信息,请参阅http://www.regular-expressions.info/unicode.html

答案 2 :(得分:6)

自问题发布以来,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("☃")); //should output "false" 

答案 3 :(得分:4)

要验证字符串只包含可打印的 ASCII 字符,请使用简单的正则表达式

/^[ -~]+$/

匹配

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

enter image description here
  - $ - 字符串锚点结束

对于Unicode可打印字符,使用\PC来自XRegExp的Unicode类别(匹配任何字符,但控件字符串),如前所述:

^\PC+$

请参阅正则表达式演示:

&#13;
&#13;
// ASCII only
var ascii_print_rx = /^[ -~]+$/;
console.log(ascii_print_rx.test("It's all right.")); // true
console.log(ascii_print_rx.test('\f ')); // false, \f is an ASCII form feed char
console.log(ascii_print_rx.test("demásiado tarde")); // false, no Unicode printable char support
// Unicode support
console.log(XRegExp.test('demásiado tarde', XRegExp("^\\PC+$"))); // true
console.log(XRegExp.test('‌ ', XRegExp("^\\PC+$"))); // false, \u200C is a Unicode zero-width joiner
console.log(XRegExp.test('\f ', XRegExp("^\\PC+$"))); // false, \f is an ASCII form feed char
&#13;
<script src="http://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

TLDR 答案

使用 string1.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu) 作为条件,真正的意思是 string1 包含任何不可打印的字符。

或者,如果您想要逻辑等价物,string1.match(/^[\P{Cc}\P{Cn}\P{Cs}]+$/gu) 作为条件将返回 true,如果 string1 只包含可打印字符。

TLDR 说明

  • \P{Cc}不要匹配控制字符。
  • \P{Cn}不要匹配未分配的字符。
  • \P{Cs}不要匹配 UTF-8 无效字符。
  • + :确保找到了一些东西,也就是说,这也意味着 "",空白字符串,将不被视为可打印。
  • /g :贪婪匹配,穷举/贪婪地在字符串中搜索指示的字符集。
  • /u :用于匹配 unicode 字符点的 unicode regex 运算符。 (来源:MDN Web Docs: Regular Expressions; Unicode Property Escapes。)

演示

var string1 = 'This string has unprintable characters \u0001';

if(string1.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu)) {
  console.log("Unprintable string: " + string1);
}
var string2 = 'This string has only printable characters.';

if(string2.match(/^[\P{Cc}\P{Cn}\P{Cs}]+$/gu)) {
  console.log("Printable string: " + string2);
}

可能的替代方案

  • \P{C} :仅匹配可见字符。不匹配任何不可见字符。
  • \P{Cc} :仅匹配非控制字符。不匹配任何控制字符。
  • \P{Cc}\P{Cn} :仅匹配已分配的非控制字符。不匹配任何控制字符或未分配的字符。
  • \P{Cc}\P{Cn}\P{Cs} :仅匹配已分配且 UTF-8 有效的非控制字符。不匹配任何控制字符、未分配字符或 UTF-8 无效字符。
  • \P{Cc}\P{Cn}\P{Cs}\P{Cf} :仅匹配已分配且 UTF-8 有效的非控制、非格式化字符。不匹配任何控制、未分配、格式或 UTF-8 无效字符。

来源和说明

查看可用于在正则表达式中进行测试的 Unicode Character Properties。您应该能够在 Microsoft .NETJavaScriptPythonJavaPHPRubyPerl 中使用这些正则表达式、Golang 甚至 Adobe。了解 Unicode 字符类是非常可转移的知识,所以我推荐使用它!

这个正则表达式将匹配任何可见的东西,无论是简写还是长写形式...

\p{L}\p{M}\p{N}\p{P}\p{S}\p{Z}
\p{Letter}\p{Mark}\p{Number}\p{Punctuation}\p{Symbol}\p{Separator}

\p 表示我们想要匹配它,但我们也可以选择使用 \P(大写)to indicate something that does not match. 所以,这意味着我们可以使用 {{1} } 类,用于“不可见的控制字符和未使用的代码点”。 (来源:Regular-Expressions.info。)一个更简单的正则表达式是 \p{C},但这在删除不可见格式时可能过于严格。您可能想仔细观察,看看什么是最好的,但其中一种选择应该能满足您的需求。

所有可匹配的 Unicode 字符集

如果您想了解任何其他可用的字符集,请查看 regular-expressions.info...

  • \P{C}\p{L}:来自任何语言的任何类型的字母。
    • \p{Letter}\p{Ll}:带有大写变体的小写字母。
    • \p{Lowercase_Letter}\p{Lu}:带有小写变体的大写字母。
    • \p{Uppercase_Letter}\p{Lt}:出现在单词开头的字母,只有单词的第一个字母大写。
    • \p{Titlecase_Letter}\p{L&}:存在大小写变体的字母(Ll、Lu 和 Lt 的组合)。
    • \p{Cased_Letter}\p{Lm}:用作字母的特殊字符。
    • \p{Modifier_Letter}\p{Lo}:没有大小写的字母或表意文字
  • \p{Other_Letter}\p{M}:用于与另一个字符组合的字符(例如重音、变音、封闭框等) .
    • \p{Mark}\p{Mn}:旨在与另一个字符组合的字符 字符而不占用额外空间(例如重音、变音等)。
    • \p{Non_Spacing_Mark}\p{Mc}:用于与另一个占用额外空间的字符组合的字符(许多东方语言中的元音符号)。
    • \p{Spacing_Combining_Mark}\p{Me}:包含与其组合的字符(圆形、方形、键帽等)的字符。
  • \p{Enclosing_Mark}\p{Z}:任何类型的空格或不可见分隔符。
    • \p{Separator}\p{Zs}:不可见但占用空间的空白字符。
    • \p{Space_Separator}\p{Zl}:行分隔符 U+2028。
    • \p{Line_Separator}\p{Zp}:段落分隔符 U+2029。
  • \p{Paragraph_Separator}\p{S}:数学符号、货币符号、丁字格、方框字符等。
    • \p{Symbol}\p{Sm}:任何数学符号。
    • \p{Math_Symbol}\p{Sc}:任何货币符号。
    • \p{Currency_Symbol}\p{Sk}:组合字符(标记)单独作为一个完整字符。
    • \p{Modifier_Symbol}\p{So}:不是数学符号、货币符号或组合字符的各种符号。
  • \p{Other_Symbol}\p{N}:任何脚本中的任何类型的数字字符。
    • \p{Number}\p{Nd}:除表意文字外的任何文字中的数字零到九。
    • \p{Decimal_Digit_Number}\p{Nl}:看起来像字母的数字,例如罗马数字。
    • \p{Letter_Number}\p{No}:上标或下标数字,或非数字 0–9 的数字(表意文字中的数字除外)。
  • \p{Other_Number}\p{P}:任何类型的标点符号。
    • \p{Punctuation}\p{Pd}:任何类型的连字符或破折号。
    • \p{Dash_Punctuation}\p{Ps}:任何类型的左括号。
    • \p{Open_Punctuation}\p{Pe}:任何类型的右括号。
    • \p{Close_Punctuation}\p{Pi}:任何类型的开场白。
    • \p{Initial_Punctuation}\p{Pf}:任何类型的结束语。
    • \p{Final_Punctuation}\p{Pc}:标点符号,例如连接单词的下划线。
    • \p{Connector_Punctuation}\p{Po}:任何类型的标点符号,不是破折号、括号、引号或连接符。
  • \p{Other_Punctuation}\p{C}:不可见的控制字符和未使用的代码点。
    • \p{Other}\p{Cc}:ASCII 或 Latin-1 控制字符:0x00–0x1F 和 0x7F–0x9F。
    • \p{Control}\p{Cf}:不可见的格式指示符。
    • \p{Format}\p{Co}:保留供私人使用的任何代码点。
    • \p{Private_Use}\p{Cs}:UTF-16 编码的代理对的一半。
    • \p{Surrogate}\p{Cn}:任何未分配字符的代码点。