2013-02-13 332 views
11

是否有表达简洁的方式:正则表达式:如何快速 W,没有下划线

\w but without _ 

也就是说,“列入\所有字符W,除了_”

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

被修改:我在问PHP中使用的正则表达式。

在此先感谢!

+2

取决于正则表达式的风味。你使用哪种语言?最简单的方法是使用'[A-Za-z0-9]'。 '\ w'确实(通常)**不包括破折号或句点。 – 2013-02-13 16:37:17

+1

根据风格'\ w'可以支持Unicode字符。除非你完全确定'\ w'表示什么,否则最好使用字符类'[]'并将其全部列出。 – nhahtdh 2013-02-13 16:38:15

回答

20

下面的字符类(在Perl)

[^\W_] 

\W相同​​

+1

好主意,但你的原子不正确。 – Bergi 2013-02-13 16:45:55

+0

向我解释它是怎么回事......并且注意'':'部分只是说实际上并不捕获原子找到的组。 – protist 2013-02-13 16:47:33

+1

@protist:原子是错误的。 '\ w'会匹配'_',并且'|'是交替的,并且像OR一样行动,而不是AND – nhahtdh 2013-02-13 16:48:57

3

为了安全起见,通常情况下,我们将使用字符类:

[a-zA-Z0-9.-] 

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

较短可能会更好,但只有当你确切地知道它代表什么。

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

+0

这将排除所有的Unicode字符,如“äö”等 – MrD 2017-12-15 08:28:05

+0

@MrD:是的,最好的方法是不使用正则表达式进行域验证。 – nhahtdh 2017-12-17 06:56:33

1

一些正则表达式的味道有可能使用负回顾后的语法:

\w(?<!_) 
+2

消极lookaheads比负向lookbehinds更广泛支持。 – 2013-02-13 16:42:25

+1

@JosephSilber确实。从概念上说,我发现“给我一个字的字符......但不是下划线”比稍后“我想要的不应该是一个下划线......否则,给我一个字的字符”稍微容易一些,如果负面的后顾*是*可用,但。 – 2013-02-13 16:49:42

4

你可以使用一个negative lookahead(?!_)\w

不过,我觉得写[a-zA-Z0-9.-]更具有可读性。

+1

那会是'(?!_)\ w',不是? – 2013-02-13 16:42:43

+0

感谢您的修补 – Bergi 2013-02-13 16:44:18

+0

环视比正常匹配慢。虽然 – nhahtdh 2013-02-13 16:47:34

2

如果我的理解是正确的\w意味着[A-Za-z0-9_]期的迹象,短线不包括在内。

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

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

+1

当您使用非英文字母时,问题随之而来。 – 2013-02-13 16:44:10

+0

@ZoltánTamási**域名**,非英文字母? – Kent 2013-02-13 16:46:12

+0

@Kent - [ICANN批准非拉丁域名](http://news.cnet.com/8301-1023_3-10387139-93.html)。 – 2013-02-13 16:47:44

1

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

+1

这是一个非常差的方法。域名有一组定义的允许字符,因此可以完成白名单。当你列出黑名单时,你需要关心你需要拒绝的Unicode字符。 – nhahtdh 2013-02-13 16:50:33

+0

@nhahtdh,我已经计算出doamin名字可以有unicode字符(例如重音元音)。所以我认为很难精确地形成一个最终正确的白名单解决方案。 – 2013-02-13 17:25:24

+0

有这方面的规格 - 这很麻烦,但有定义。列入黑名单时,人们往往会忘记/忽略某些事物。 – nhahtdh 2013-02-13 17:28:23

0

你可以写这样的事情:如果你使用preg_filter以该字符串

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

\ w中的任何字符(不包括_下划线)都将被过滤。

相关问题