有没有一种简洁的表达方式:
\w but without _
也就是说,“所有包含在\w中的字符,除了下划线”
我提出这个问题是因为我正在寻找表达域名验证最简洁的方式。域名可能包括小写和大写字母、数字、句点和破折号,但没有下划线。\w包括以上所有内容,还有一个下划线。那么,有没有办法通过正则表达式语法从\w中“去除”下划线?
编辑:我所问的是PHP中使用的正则表达式。
提前感谢!
以下是 Perl 中的字符类:
[^\W_]
\W
与[^\w]
相同。
\w
将匹配_
,而|
是交替并且像OR一样起作用,而不是AND。 - nhahtdh.
和-
是否包含在内,因为什么被认为是“单词”字符在不同的语言环境下略有不同。一些来源说\w
等同于[A-Za-z0-9_]
(但一定要指出这并不总是正确的)。[^\W_]
是\w
但没有_
,尽管如此。 - protist[a-zA-Z0-9_]
。 - Adithya(?!_)\w
,对吧? - Zero Piraeus]\^-
)需要转义,而在不引起歧义的情况下则不需要。 - Bergi\w
表示 [a-zA-Z0-9.-_]
。 - Bergi为了保险起见,通常我们会使用字符类:
[a-zA-Z0-9.-]
上述的“片段”正则表达式匹配英文字母、数字、点号.
和破折号-
。即使是基本的正则表达式支持,它也应该可以工作。
较短的表达式可能更好,但前提是你确切知道它代表什么。
我不知道您使用的语言是什么。在许多引擎中,\w
等同于[a-zA-Z0-9_]
(一些要求“ASCII模式”)。然而,一些引擎对正则表达式具有Unicode支持,并且可以扩展\w
以匹配Unicode字符。
\w
表示 [A-Za-z0-9_]
,不包括句号和破折号。[a-zA-Z0-9.-]
。\w(?<!_)
[^a-zA-Z0-9]+
的人来说,可以简写为 [\W^_]+
(在Python中)。\W
可能会导致微小的性能下降,因为首先匹配的是 [^a-zA-Z0-9_]
,然后再取消匹配 _
。def camelCaseNotation(value):
"""Select all symbolic character plus the next alphabetical character. Remove symbols and uppercases the alphabetic character."""
return re.sub(r"[\W^_]+([\w]{0,1})", lambda m: m.group(1).upper(), value)
\([^\w]|_)\u
我会从 [^_] 开始,然后考虑需要拒绝哪些其他字符。如果你需要过滤键盘输入,枚举所有不想要的字符就很简单了。
[A-Za-z0-9]
。\w
通常不包括连字符或句号。 - Felix Kling\w
可能支持 Unicode 字符。除非你完全确定\w
代表什么,最好使用字符类[]
并列出所有常规字符。 - nhahtdh