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

Aur*_*urA 12 javascript regex javascript-events

寻找一个正则表达式来验证所有可打印字符.正则表达式只需要在JavaScript中使用.我已经阅读了这篇文章,但它主要讨论的是.net,Java和C,但不是JavaScript.

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

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

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

Tim*_*ker 14

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

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

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

  • UTF-8*UTF-16和UTF-32的字符数相同*.UTF-8只是一种编码 - 它具有所有unicode - 整个事物.你的意思是ASCII吗? (4认同)

Ωme*_*ega 11

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


如果你想使用unicode,首先阅读Javascript + Unicode正则表达式.

我建议然后使用正则表达式模式 ^[^\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


Wik*_*żew 11

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

/^[ -~]+$/
Run Code Online (Sandbox Code Playgroud)

它匹配

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

在此处输入图片说明
--$字符串锚点的结尾

对于 Unicode 可打印字符,使用\PCUnicode 类别(匹配任何字符,但控制字符) from XRegExp,正如已经提到的:

^\PC+$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示:

  • 第一个选项很巧妙(除非我们需要 Unicode)。 (4认同)

Hol*_*ger 8

TLDR 答案

\n

用作string1.match(/[\\p{Cc}\\p{Cn}\\p{Cs}]+/gu)条件语句,其真实含义string1 包含任何不可打印的字符。

\n

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

\n

TLDR 解释

\n
    \n
  • \\P{Cc}:匹配控制字符。
  • \n
  • \\P{Cn}匹配未分配的字符。
  • \n
  • \\P{Cs}匹配 UTF-8 无效字符。
  • \n
  • +:确保找到某些内容,即,这也意味着""空白字符串将不会被视为可打印。
  • \n
  • /g:贪婪匹配,穷举/贪婪地搜索字符串中指定的字符集。
  • \n
  • /u:用于匹配 unicode 字符点的 unicode 正则表达式运算符。(来源:MDN Web 文档:正则表达式;Unicode 属性转义。)
  • \n
\n

演示

\n

\r\n
\r\n
var string1 = \'This string has unprintable characters \\u0001\';\n\nif(string1.match(/[\\p{Cc}\\p{Cn}\\p{Cs}]+/gu)) {\n  console.log("Unprintable string: " + string1);\n}\nvar string2 = \'This string has only printable characters.\';\n\nif(string2.match(/^[\\P{Cc}\\P{Cn}\\P{Cs}]+$/gu)) {\n  console.log("Printable string: " + string2);\n}
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

可能的替代方案

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

来源及解释

\n

查看可用于在正则表达式中测试的可用Unicode 字符属性。您应该能够在Microsoft .NETJavaScriptPythonJavaPHPRubyPerlGolang甚至Adob​​e中使用这些正则表达式。了解 Unicode 字符类是非常可转移的知识,所以我建议使用它!

\n

该正则表达式将匹配任何可见的内容,以简写形式和长写形式给出......

\n
\\p{L}\\p{M}\\p{N}\\p{P}\\p{S}\\p{Z}\n\\p{Letter}\\p{Mark}\\p{Number}\\p{Punctuation}\\p{Symbol}\\p{Separator}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

所有可匹配的 Unicode 字符集

\n

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

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


小智 7

自问题发布以来,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" 
Run Code Online (Sandbox Code Playgroud)