2012-03-28 174 views
9

我想用\w正则表达式来允许字母数字,但我不想让下划线_成为它的一部分。由于_包含在\w中。所以我编码这样,但不起作用,我的错误是什么?从字母数字正则表达式中排除下划线

(/^roger\w{2,3}[0-9a-z]/i) 

我期待比AZ或1-2其他被排除任何字符

前 - roger3_2 or roger46_ or roger2_

roger54或roger4a或roger455或rogerAAA

应该是o ķ

+2

怎么没有按它工作吗?请提供更多细节。 – Bojangles 2012-03-28 15:05:48

+0

你应该可以添加输入和预期的输出... – Stefan 2012-03-28 15:11:39

回答

6
  • 一个数字代码点是\pN\p{Number}
  • 一个数字代码点是\d,\p{digit},\p{Nd},\p{Decimal_Number}\p{Numeric_Type=Decimal}
  • 字母代码点是\p{alpha}\p{Alphabetic}。它包括所有的\p{Digit},\p{Letter}\p{Letter_Number}码点,以及某些\p{Mark}\p{Symbol}码点。
  • 编程字代码点是\w[\p{Alphabetic}\p{Digit}\p{Mark}\p{Connector_Punctuation}]

由最严格定义的字母数字代码点因此必然是[\p{Alphabetic}\p{Number}],通常缩写为[\p{alpha}\pN]

+0

非常感谢您的详细信息。 – raindrop 2012-03-28 15:59:18

23

你可以尝试这样的:

[^_\W]+ 
+0

简单但非常有效,非常感谢! – raindrop 2012-03-28 16:04:13

3

假设标识符必须以字母字符开始,并且然后可以包含任意数量的字母或数字的,我这样做:

my $string = 'roger54a'; 
print "Match\n" if $string =~ m/\A\p{alpha}[\p{alpha}\p{Number}]*\z/; 

锚定至串的开头和结尾,排除任何字符不匹配单个alpha的特定集合,后跟任意数量的alpha和数字。

更新:我看到tchrist刚刚给出了Unicode属性的一个很好的解释。这个答案提供了完整的正则表达式的上下文。

如果你想领先的“阿尔法”是两个或三个数字后面的字母数字,只需添加相应的量词:

$string =~ m/\A\p{alpha}{2,3}[\p{alpha}\p{Number}]*\z/

UPDATE2:我看到你更强的定义”在这里重新寻找对其中一个答案的评论。这是我对其采取看到你的澄清后:

m/\Aroger[\p{alpha}\p{Number}]{2,3}\z/

+0

非常感谢,这非常有帮助 – raindrop 2012-03-28 15:58:50

2

你提出的解决方案:

(/^roger\w{2,3}[0-9a-z]/i) 

方式:

\w{2,3} - 2或3个字母数字,包括_

[0-9a-z](带/ i) - 字母数字的单个字符,不包括_

我在开始时没有看到任何可接受的3位字母数字。这属于吗?

“roger54”和“roger4a”都应该失败,因为上述正则表达式需要至少三个字符在“roger”之后。同样,“roger_ a”会成功,因为“_”通过\ w {2,3}(特别是\ w {3})。

您的要求听起来像你想的这些更之一:

那就是“罗杰”后面跟着一个或多个(+)或零个或多个(不区分大小写)(*),信和/或数字。

+0

你指出我的问题,\ w {2,3}我认为2或3字母数字在罗杰之后会好的。你的解决方案是可以的,但我希望只允许2或3个字母数字不能少。我如何限制这一点。正如我所说我的代码工作正常,但它允许(_),所以我不希望这是允许的。 – raindrop 2012-03-28 15:46:57

+0

啊..我给你../^roger[0-9a-z]{2,3}/i工作。非常感谢你!! – raindrop 2012-03-28 15:58:17

+0

我错过了“罗杰”之后仅有2或3个字母数字的部分。我很高兴你得到它。顺便说一下,我假设你在做Perl。我不再确定,但它确实看起来像Perl。 – 2012-03-28 21:38:49

0

我试图找到一个解决方案,这也是这个解决方案并没有为我工作在C#时尝试做一个正则表达式替换。如果别人在搜索:

c# Regex.Replace [^\w ] that also removes underscores?

这是我在C#中使用:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w]+]", "");

如果你想保留空间:

cleaned_string = Regex.Replace(input_string, @"[_]+|[^\w\s]+", "");