从字母数字正则表达式中排除下划线

时间:2012-03-28 15:04:00

标签: regex

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

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

我期待排除A-Z或1-2以外的任何角色

前 - roger3_2 or roger46_ or roger2_

  

roger54或roger4a或roger455或rogerAAA

没关系

5 个答案:

答案 0 :(得分:28)

您可以尝试以下方式:

[^_\W]+

答案 1 :(得分:8)

  • 数字代码点为\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]

答案 2 :(得分:3)

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

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

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

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

如果你想要领先的阿尔法'要是两位或三位数后跟字母数字,只需添加适当的量词:

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

更新2:我在这里给出一个答案的评论中看到了一个更强烈的定义。在看到你的澄清之后,我就采取了这个措施:

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

答案 3 :(得分: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})。

您的请求听起来像是您想要更多其中一个:

/^roger[0-9a-z]+/i
/^roger[0-9a-z]*/i

即“roger”(不区分大小写)后跟一个或多个(+)或零个或多个(*)字母和/或数字。

答案 4 :(得分: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]+", "");