【问题标题】:Purpose of [^\x20-\x7E] in regular expressions[^\x20-\x7E] 在正则表达式中的用途
【发布时间】:2010-11-02 06:26:32
【问题描述】:
 [^\x20-\x7E]

我看到这种模式用于正则表达式,其目标是删除非 ascii 字符串中的字符。什么意思?

【问题讨论】:

    标签: regex


    【解决方案1】:

    它表示类似:所有不在 (^) 范围内的字符 \x20-\x7E(十六进制 0x200x7E)。

    根据http://www.asciitable.com/,这些是从空格到~的字符。

    【讨论】:

    • 即可打印字符
    • 请注意,您也可以使用 API 进行检查。例如,在 Java 中,您可以使用 java.lang.Character.isISOControl(character) 和类似的方法使您的代码更具可读性。
    • 有些语言没有用于此类目的的 API。在 PHP 中,您必须执行以下操作来提取特殊字符:preg_replace_callback('/[^\x20-\x7f]/', function($match) { return DO_SOMETHING_WITH_SPECIAL_CHARS($match[0]); }, $url) ;
    【解决方案2】:

    括号 [] 中的脱字符 (^) 表示“不是”,\x20-\x7E 表示一段 ascii 字符,其中 \x20(空格)是范围的开头,\x7E(~ ) 结束。它基本上是任何不是字母、数字或普通标点符号的东西。

    【讨论】:

      【解决方案3】:

      这意味着匹配任何不是打印字符的字符。

      打印字符包括a到z、A到Z、0到9以及“,;$#%等符号。

      ^ not
      \x20 hex code for space character
      - to 
      \x7e hex code for ~ (tilde) character
      

      所有的 ascii 打印字符都介于这两者之间。

      此语句匹配非 ascii 字符以及 ascii 控制(非打印)字符,例如 bell、tab、null 等。

      看看

      man ascii
      

      在 unix 系统上查看它匹配的字符。

      在 perl 中,你也可以写成

      [^ -~]
      

      [[:^cntrl:]]
      

      最后一个略有不同,因为它匹配任何非控制字符,包括扩展 ascii(例如重音字符)和 unicode。

      您可能不想只使用 ascii,因为非美国地区经常使用这个小范围之外的有效打印字符,例如øüéåç...

      【讨论】:

      • 我想你的意思是 [^[:print:]] 最后一个。 POSIX 字符类表示法包括方括号和冒号,整个内容必须放在另一组方括号内。 (当然,[:cntrl:] 是错误的类。)但是,POSIX 类也应该是区域敏感的,这意味着它们可以匹配,例如,重音字母以及基本的 ASCII 集。
      • 啊,是的,那太草率了(已经很晚了)。 cntrl 确实与以前的不同,因为它将包括在扩展的 ascii 甚至 unicode 范围内打印字符,但我相信这很可能是预期的。
      • 我建议不要单独使用 POSIX 字符类,尤其是在这种情况下,我们不知道正在使用哪种正则表达式风格、它运行在哪个操作系统上或在哪个语言环境中。所有这些因素都会改变他们的行为。
      • 这个答案最完整:[^\x20-\x7E] 不限于“不打印字符”。它还匹配非 ASCII 字符,如“ä”、“ö”等。我认为,人们经常使用 [^\x20-\x7E] 来处理这些特殊字符(元音变音)。
      【解决方案4】:

      它的意思是“任何不是十六进制范围 0x20 到 0x7E 的字符代码,即 32 到 126”。

      【讨论】:

        猜你喜欢
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 1970-01-01
        • 2017-01-18
        • 1970-01-01
        相关资源
        最近更新 更多