寻找一个正则表达式来验证所有可打印的字符。正则表达式只需要在 JavaScript 中使用。我已经阅读了这篇文章,但它主要谈论 .net、Java 和 C 而不是 JavaScript。
您必须只允许这些可打印字符:
az、AZ、0-9 和三十二个符号:!"#$%&'()*+,-./:;<=>?@[] ^_`{|}~ 和空格
需要一个 JavaScript 正则表达式来验证输入字符是上述之一并丢弃其余的。
寻找一个正则表达式来验证所有可打印的字符。正则表达式只需要在 JavaScript 中使用。我已经阅读了这篇文章,但它主要谈论 .net、Java 和 C 而不是 JavaScript。
您必须只允许这些可打印字符:
az、AZ、0-9 和三十二个符号:!"#$%&'()*+,-./:;<=>?@[] ^_`{|}~ 和空格
需要一个 JavaScript 正则表达式来验证输入字符是上述之一并丢弃其余的。
如果您想匹配 UTF-8 集中的所有可打印字符(如您在 8 月 21 日的评论所示),您自己将很难做到这一点。JavaScript 的原生正则表达式具有糟糕的 Unicode 支持。但是您可以将XRegExp与 regex 一起使用^\P{C}*$
。
如果您只想将编辑中提到的那几个 ASCII 字母与 8 月 22 日的帖子相匹配,那么正则表达式是微不足道的:
/^[a-z0-9!"#$%&'()*+,.\/:;<=>?@\[\] ^_`{|}~-]*$/i
对于非 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。要验证字符串仅包含可打印的ASCII字符,请使用简单的正则表达式,例如
/^[ -~]+$/
它匹配
^
- 字符串锚的开始[ -~]+
- 一个或多个(由于+
量词)在 ASCII 表中从空格到波浪号的字符:对于 Unicode 可打印字符,使用\PC
Unicode 类别(匹配除控制字符以外的任何字符)XRegExp
,如前所述:
^\PC+$
请参阅正则表达式演示:
// 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
<script src="http://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.min.js"></script>
自从发布此问题以来,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"
string1.match(/[\p{Cc}\p{Cn}\p{Cs}]+/gu)
用作条件句,具有真实含义,包含string1
任何不可打印的字符。
或者,如果您想要逻辑等价物,则如果仅包含可打印字符string1.match(/^[\P{Cc}\P{Cn}\P{Cs}]+$/gu)
,则条件将返回 true 。string1
\P{Cc}
:不匹配控制字符。\P{Cn}
:不匹配未分配的字符。\P{Cs}
:不匹配 UTF-8 无效字符。+
: 确保找到了一些东西,也就是说,这也意味着""
空字符串将不会被认为是可打印的。/g
:贪婪匹配,穷举/贪婪地在字符串中搜索指定的字符集。/u
: 用于匹配 unicode 字符点的 unicode 正则表达式运算符。(来源:MDN 网络文档:正则表达式;Unicode 属性转义。)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 字符属性。您应该能够在Microsoft .NET、JavaScript、Python、Java、PHP、Ruby、Perl、Golang甚至Adob e 中使用这些正则表达式。了解 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
(capitalized)来表示不匹配的东西。 所以,这意味着我们可以使用\p{C}
类,用于“不可见的控制字符和未使用的代码点”。(来源:Regular-Expressions.info。)然后是一个更简单的正则表达式\P{C}
,但这在删除不可见格式方面可能过于严格。您可能想仔细观察,看看什么是最好的,但其中一种选择应该适合您的需要。
如果您想知道任何其他可用的字符集,请查看regular-expressions.info ...
\p{L}
或\p{Letter}
:任何语言的任何类型的字母。
\p{Ll}
或\p{Lowercase_Letter}
:具有大写变体的小写字母。\p{Lu}
或\p{Uppercase_Letter}
:具有小写变体的大写字母。\p{Lt}
或\p{Titlecase_Letter}
:出现在单词开头的字母,仅单词的第一个字母大写。\p{L&}
or \p{Cased_Letter}
:以小写和大写变体形式存在的字母(Ll、Lu 和 Lt 的组合)。\p{Lm}
or \p{Modifier_Letter}
: 一个像字母一样使用的特殊字符。\p{Lo}
or \p{Other_Letter}
: 没有小写和大写的字母或表意文字\p{M}
or \p{Mark}
: 一个要与另一个字符组合的字符(例如重音符号、变音符号、封闭框等)。
\p{Mn}
or \p{Non_Spacing_Mark}
: 一个旨在与另一个字符组合而不占用额外空间的字符(例如重音符号、变音符号等)。\p{Mc}
或\p{Spacing_Combining_Mark}
: 一个旨在与占用额外空间的另一个字符组合的字符(许多东方语言中的元音符号)。\p{Me}
or \p{Enclosing_Mark}
: 一个包含与之组合的字符(圆形、方形、键帽等)的字符。\p{Z}
or \p{Separator}
: 任何类型的空格或不可见的分隔符。
\p{Zs}
or \p{Space_Separator}
:一个不可见的空白字符,但确实占用空间。\p{Zl}
或\p{Line_Separator}
:行分隔符 U+2028。\p{Zp}
或\p{Paragraph_Separator}
:段落分隔符 U+2029。\p{S}
或\p{Symbol}
:数学符号、货币符号、装饰符号、画框字符等。
\p{Sm}
或\p{Math_Symbol}
:任何数学符号。\p{Sc}
或\p{Currency_Symbol}
:任何货币符号。\p{Sk}
or \p{Modifier_Symbol}
: 一个组合字符(标记)作为一个完整的字符。\p{So}
or \p{Other_Symbol}
: 不是数学符号、货币符号或组合字符的各种符号。\p{N}
或\p{Number}
:任何脚本中的任何类型的数字字符。
\p{Nd}
或\p{Decimal_Digit_Number}
:除表意文字外的任何文字中的数字 0 到 9。\p{Nl}
or \p{Letter_Number}
: 一个看起来像字母的数字,例如罗马数字。\p{No}
或\p{Other_Number}
:上标或下标数字,或不是数字 0-9 的数字(不包括表意文字中的数字)。\p{P}
或\p{Punctuation}
:任何类型的标点符号。
\p{Pd}
or \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}
or \p{Other_Punctuation}
: 任何不是破折号、括号、引号或连接符的标点符号。\p{C}
或\p{Other}
:不可见的控制字符和未使用的代码点。
\p{Cc}
或\p{Control}
:ASCII 或 Latin-1 控制字符:0x00–0x1F 和 0x7F–0x9F。\p{Cf}
或\p{Format}
:不可见的格式指示器。\p{Co}
或\p{Private_Use}
:保留供私人使用的任何代码点。\p{Cs}
or \p{Surrogate}
: UTF-16 编码的代理对的一半。\p{Cn}
或\p{Unassigned}
:任何未分配字符的代码点。