如何在Perl正则表达式中允许字面上的点?

16

我使用这个条件来检查值是否为字母数字值:

$value =~ /^[a-zA-Z0-9]+$/

如何修改这个正则表达式,以便考虑值中可能有一个句点.,而不接受任何其他特殊字符?

5个回答

25
$value =~ /^[a-zA-Z0-9.]+$/

24
在字符类内部,句点(.)没有特殊含义。[.] - Christoffer Hammarström
通常在正则表达式中,“.”表示“匹配任何字符”。但是在字符类中,它并不是这个意思(否则字符类的作用是什么呢?)。所以@cmptrgeekken是错误的,但他提出问题的思路是正确的。 - jemfinch
2
@goe,“.”代表任何字符,但在“[]”内部,它只是一个点。所以对于你的情况,“.”或“\。”是一样的。 - YOU
4
在字符类(方括号)中,除非通过转义与其形成一个类限定符(\s\p{...})或ANSI类([:...:]),否则所有字符都是字面的,所以主要需要转义的是 '\\' 和方括号本身。尽管如此,有时您会发现由于Perl内部全局插值而需要转义 $。(我曾经尝试过使用类似 qr/[#@$]/ 的类,其中Perl想要将补丁级别作为子程序并清除类定义的结尾,这真的很有趣。) - Axeman
@YOU - 许多正则表达式的 flavor 都会将 \. 作为字符类中的 . 接受,但并非所有 flavor 都会这样做。最好只转义必须转义的内容。 - JDB
显示剩余2条评论

4
使用 alnumPosix 字符类,字符数量减少了一个 :)
value =~ /^[[:alnum:].]+$/; 

2

不要忘记使用/i选项和\d字符类。

$value =~ /^[a-z\d.]+$/i

1

如果您不想允许除字符类中允许的字符之外的任何字符,则不应使用行尾锚点$,因为它允许一个尾随换行符。而应该使用绝对字符串结尾锚点\z

 $value =~ /^[a-z0-9.]+\z/i;

-1

看看 Perl 正则表达式

\w  Match "word" character (alphanumeric plus "_")


$value =~ /^[\w+.]\.*$/;

\w 是字母数字加上下划线。 - Eugene Yarmash
同意@eugene的观点。你必须小心使用\w,因为有些讨厌的'_'字符。它们是Perl数字解释的一部分,作为千位分隔符,可能是因为变量名而不用于普通文本。 - the Tin Man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接