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

时间:2009-08-08 02:04:28

标签: .net regex

是否有像\ w这样的特殊正则表达式语句表示所有可打印的字符?我想验证一个字符串只包含一个可以打印的字符 - 即。不包含\ b(铃声)等ASCII控制字符,或者等等。键盘上的任何东西都可以,UTF字符也是如此。

如果没有特殊声明,我如何在正则表达式中指定它?

7 个答案:

答案 0 :(得分:16)

聚会很晚,但这个正则表达式有效:/[ -~]/

如何?它匹配范围从 space (ASCII DEC 32)到 tilde (ASCII DEC 126)的所有字符,这是所有字符的范围可打印的字符。

如果要删除非ASCII字符,可以使用以下内容:

$someString.replace(/[^ -~]/g, '');

注意:这不是有效的.net代码,而是后来通过搜索引擎偶然发现此问题的人的正则表达式使用示例。

答案 1 :(得分:14)

如果你的正则表达式支持Unicode properties,这可能是最好的方法:

\P{Cc}

匹配任何不是控制字符的字符,无论是ASCII - [\x00-\x1F\x7F] - 还是Latin1 - [\x80-\x9F](也称为C1控制字符)。

[:print:]\p{Print}这样的POSIX类的问题在于它们可以根据正则表达式的风格以及可能的底层平台的区域设置来匹配不同的东西。在Java中,它们严格地面向ASCII。这意味着\p{Print}仅匹配ASCII打印字符 - [\x20-\x7E] - 而\P{Cntrl}(注意大写'P')匹配 ASCII控件的所有内容角色 - [^\x00-\x1F\x7F]。也就是说,它匹配任何非控制字符的ASCII字符,任何非ASCII字符 - 包括C1控制字符。

答案 2 :(得分:8)

POSIX字符类标识[:print:]应与可打印字符匹配,而[:cntrl:]用于控制字符。请注意,这些匹配代码贯穿整个ASCII表,因此它们可能不适合匹配其他编码。

如果失败,表达式[\x00-\x1f]将通过ASCII控制字符匹配,尽管这些字符可以在其他编码中打印。

答案 3 :(得分:4)

TLDR 答案

使用这个正则表达式...

\P{Cc}\P{Cn}\P{Cs}

工作演示

在这个演示中,我使用这个正则表达式来搜索字符串 "Hello, World!_"。我将在末尾添加一个奇怪的字符 (char)4 — 这是 END TRANSMISSION 的字符。

using System;
using System.Text.RegularExpressions;

public class Test {
    public static void Main() {
        // your code goes here
        var regex = new Regex(@"![\P{Cc}\P{Cn}\P{Cs}]");
        var matches = regex.Matches("Hello, World!" + (char)4);
        Console.WriteLine("Results: " + matches.Count);
        foreach (Match match in matches) {
            Console.WriteLine("Result: " + match);
        }
    }
}

Full Working Demo at IDEOne.com

TLDR 说明

  • \P{Cc}不要匹配控制字符。
  • \P{Cn}不要匹配未分配的字符。
  • \P{Cs}不要匹配 UTF-8 无效字符。

替代方案

  • \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 字符类是非常可转移的知识,所以我推荐使用它!

所有可匹配的 Unicode 字符集

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

  • \p{L}\p{Letter}:来自任何语言的任何类型的字母。
    • \p{Ll}\p{Lowercase_Letter}:带有大写变体的小写字母。
    • \p{Lu}\p{Uppercase_Letter}:带有小写变体的大写字母。
    • \p{Lt}\p{Titlecase_Letter}:出现在单词开头的字母,只有单词的第一个字母大写。
    • \p{L&}\p{Cased_Letter}:存在大小写变体的字母(Ll、Lu 和 Lt 的组合)。
    • \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}\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}\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}\p{Other_Number}:上标或下标数字,或非数字 0–9 的数字(表意文字中的数字除外)。
  • \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}\p{Control}:ASCII 或 Latin-1 控制字符:0x00–0x1F 和 0x7F–0x9F。
    • \p{Cf}\p{Format}:不可见的格式指示符。
    • \p{Co}\p{Private_Use}:保留供私人使用的任何代码点。
    • \p{Cs}\p{Surrogate}:UTF-16 编码的代理对的一半。
    • \p{Cn}\p{Unassigned}:任何未分配字符的代码点。

答案 4 :(得分:1)

它非常依赖于您正在使用的正则表达式包。这是其中一种情况,其中一些人说,关于标准的好处是有很多可供选择。

如果你碰巧使用C,isprint(3)功能/宏是你的朋友。

答案 5 :(得分:1)

在Java中,\p{Print}选项指定the printable character class

答案 6 :(得分:0)

添加到@ Alan-Moore,\P{Cc}实际上是Negative Unicode Category or Unicode Block的示例(参考:Character Classes in Regular Expressions)。 \P{name}不属于的任何字符与Unicode常规类别或命名块匹配。有关.Net

中支持的命名块的更多示例,请参阅引用链接