我希望使用\w
正则表达式来允许字母数字,但我不希望下划线_
成为其中的一部分。由于_
中包含\w
。所以我这样编码但不起作用,我的错误是什么?
(/^roger\w{2,3}[0-9a-z]/i)
我期待排除A-Z或1-2以外的任何角色
前 -
roger3_2 or roger46_ or roger2_
但
roger54或roger4a或roger455或rogerAAA
没关系
答案 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]+", "");