38

有没有简洁的表达方式:

\w but without _

即“\w 中包含的所有字符,_ 除外”

我问这个是因为我正在寻找最简洁的方式来表达域名验证。域名可以包含小写和大写字母、数字、句号和破折号,但不能包含下划线。\w 包括以上所有内容,外加一个下划线。那么,有没有办法通过正则表达式语法从 \w 中“删除”下划线?

编辑:我在询问 PHP 中使用的正则表达式。

提前致谢!

4

7 回答 7

50

以下字符类(在 Perl 中)

[^\W_]

\W是相同的[^\w]

于 2013-02-13T16:43:12.923 回答
13

您可以使用负前瞻(?!_)\w

但是,我认为写作[a-zA-Z0-9.-]更具可读性。

于 2013-02-13T16:41:18.720 回答
3

为了安全起见,通常我们会使用字符类:

[a-zA-Z0-9.-]

上面的正则表达式“片段”匹配英文字母和数字,加上句点.和破折号-。即使使用最基本的正则表达式支持,它也应该可以工作。

越短越好,但前提是您确切知道它代表什么。

不知道你用的是什么语言。在很多引擎中,\w相当于[a-zA-Z0-9_](有些需要“ASCII 模式”)。但是,某些引擎对正则表达式具有 Unicode 支持,并且可能会扩展\w以匹配 Unicode 字符。

于 2013-02-13T16:40:36.257 回答
3

如果我的理解正确,则\w表示[A-Za-z0-9_]句号,不包括破折号。

信息: http ://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

所以我想你想要的是[a-zA-Z0-9.-]

于 2013-02-13T16:42:40.477 回答
1

一些正则表达式风格具有您可能使用的否定后向语法:

\w(?<!_)
于 2013-02-13T16:41:01.943 回答
0

我会从 [^_] 开始,然后想想我还需要拒绝哪些字符。如果您需要过滤键盘输入,枚举所有不需要的字符非常简单。

于 2013-02-13T16:43:10.363 回答
0

你可以这样写:

\([^\w]|_)\u

如果您将此字符串与 preg_filter 一起使用,则 \w 中的任何字符(不包括 _ 下划线)都将被过滤。

于 2017-12-18T13:59:35.653 回答