正则表达式中 [^\x20-\x7E] 的作用是什么?

48
 [^\x20-\x7E]

我看到这个模式被用于一个正则表达式,目的是从字符串中删除非ASCII字符。它是什么意思?

4个回答

54

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

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


10
把英语翻译成中文。只返回翻译后的文本:即可打印字符。 - annakata
值得注意的是,你也可以使用API来进行检查。例如,在Java中,你可以使用java.lang.Character.isISOControl(character)等方法来使你的代码更易读。 - Stan
有些编程语言没有为此提供API。在PHP中,您需要执行以下操作来提取特殊字符:preg_replace_callback('/[^\x20-\x7f]/', function($match) { return DO_SOMETHING_WITH_SPECIAL_CHARS($match[0]); }, $url); - Hermann Schwarz

8

它意味着匹配任何非打印字符。

打印字符包括a到z,A到Z,0到9和符号如",;$#%等。

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

所有的ASCII打印字符都落在这两个字符之间。
此语句匹配非ASCII字符以及ASCII控制(非打印)字符,例如响铃、制表符、空值和其他字符。
请看:
man ascii

在Unix系统中,可以查看它匹配哪些字符。在Perl中,您也可以将其编写为:
[^ -~]

或者

[[:^cntrl:]]

最后一个正则表达式略有不同,它匹配任何非控制字符,包括扩展的ASCII字符(例如带重音符号的字符)和Unicode字符。

您可能不想限制自己只使用ASCII字符集,因为非美国地区经常使用此小范围之外的有效打印字符,例如øüéåç...


我认为你最后一个应该是 [^[:print:]]。POSIX字符类符号包括方括号和冒号,整个符号必须放在另一组方括号中。 (当然,[:cntrl:]是错误的类别。)但是,POSIX类也应该是与语言环境相关的,这意味着它们可以匹配例如带重音的字母以及基本ASCII集。 - Alan Moore
啊,是的,那个有点草率(因为很晚了)。cntrl确实与之前的不同,因为它将包括扩展ASCII和甚至Unicode范围内的打印字符,但我相信这可能就是原本的意图。 - Alex Brown
我建议不要改动 POSIX 字符类,尤其是在这种情况下,我们不知道使用的正则表达式类型、操作系统是哪个,或者所处的语言环境。所有这些因素都可能改变它们的行为。 - Alan Moore
这个答案最完整: [^ \ x20- \ x7E] 不仅限于“不打印字符”。它还匹配非ASCII字符,例如“ä”,“ö”等。我认为,人们经常使用[^\x20-\x7E]来处理这种特殊字符(umlauts)。 - Hermann Schwarz

3
这意味着“任何不在十六进制范围0x20至0x7E(即32至126)的字符代码以外的内容”。

2
方括号[]中的插入符(^)表示“非”,而\x20-\x7E表示ASCII字符范围,其中\x20(空格)是范围的开始,\x7E(~)是结束。它基本上是任何不是字母、数字或常见标点符号的字符。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接