我想用\w
正则表达式来允许字母数字,但我不想让下划线_
成为它的一部分。由于_
包含在\w
中。所以我编码这样,但不起作用,我的错误是什么?从字母数字正则表达式中排除下划线
(/^roger\w{2,3}[0-9a-z]/i)
我期待比AZ或1-2其他被排除任何字符
前 - roger3_2 or roger46_ or roger2_
但
roger54或roger4a或roger455或rogerAAA
应该是o ķ
我想用\w
正则表达式来允许字母数字,但我不想让下划线_
成为它的一部分。由于_
包含在\w
中。所以我编码这样,但不起作用,我的错误是什么?从字母数字正则表达式中排除下划线
(/^roger\w{2,3}[0-9a-z]/i)
我期待比AZ或1-2其他被排除任何字符
前 - roger3_2 or roger46_ or roger2_
但
roger54或roger4a或roger455或rogerAAA
应该是o ķ
\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]
。
非常感谢您的详细信息。 – raindrop 2012-03-28 15:59:18
假设标识符必须以字母字符开始,并且然后可以包含任意数量的字母或数字的,我这样做:
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/
非常感谢,这非常有帮助 – raindrop 2012-03-28 15:58:50
你提出的解决方案:
(/^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})。
您的要求听起来像你想的这些更之一:
那就是“罗杰”后面跟着一个或多个(+)或零个或多个(不区分大小写)(*),信和/或数字。
你指出我的问题,\ w {2,3}我认为2或3字母数字在罗杰之后会好的。你的解决方案是可以的,但我希望只允许2或3个字母数字不能少。我如何限制这一点。正如我所说我的代码工作正常,但它允许(_),所以我不希望这是允许的。 – raindrop 2012-03-28 15:46:57
啊..我给你../^roger[0-9a-z]{2,3}/i工作。非常感谢你!! – raindrop 2012-03-28 15:58:17
我错过了“罗杰”之后仅有2或3个字母数字的部分。我很高兴你得到它。顺便说一下,我假设你在做Perl。我不再确定,但它确实看起来像Perl。 – 2012-03-28 21:38:49
我试图找到一个解决方案,这也是这个解决方案并没有为我工作在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]+", "");
怎么没有按它工作吗?请提供更多细节。 – Bojangles 2012-03-28 15:05:48
你应该可以添加输入和预期的输出... – Stefan 2012-03-28 15:11:39