是否有简洁的表达方式:
\w but without _
也就是说,“所有字符都包含在\ w中,除了_”
我问这个是因为我正在寻找表达域名验证的最简洁方式。域名可以包括小写和大写字母,数字,句号和破折号,但不包括下划线。 \ w包括以上所有内容,加上下划线。那么,有没有办法通过正则表达式语法从\ w“删除”下划线?
编辑:我问的是PHP中使用的正则表达式。
提前致谢!
以下字符类(在Perl中)
[^\W_]
\W
与[^\w]
相同
你可以使用negative lookahead:(?!_)\w
但是,我认为编写[a-zA-Z0-9.-]
更具可读性。
为了安全起见,通常我们会使用字符类:
[a-zA-Z0-9.-]
上面的正则表达式“片段”匹配英文字母和数字,加上句号.
和破折号-
。即使使用最基本的正则表达式支持,它也应该可以工作。
更短可能更好,但前提是你确切知道它代表什么。
我不知道你用的是哪种语言。在很多引擎中,\w
相当于[a-zA-Z0-9_]
(有些需要“ASCII模式”)。但是,某些引擎对正则表达式具有Unicode支持,并且可能会扩展\w
以匹配Unicode字符。
如果我的理解是正确的\w
意味着[A-Za-z0-9_]
期间标志,破折号不包括在内。
信息:http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
所以我猜你想要的是[a-zA-Z0-9.-]
一些正则表达式的风格可能会使用负面的lookbehind语法:
\w(?<!_)
我会从[^ _]开始,然后想想我还需要否认的其他字符。如果您需要过滤键盘输入,则枚举所有不需要的字符非常简单。
你可以写这样的东西:
\([^\w]|_)\u
如果对此字符串使用preg_filter,则将过滤\ w(不包括_下划线)中的任何字符。