-1

我正在尝试为 perl 编写一个正则表达式,它将检查字母数字值(有空格)但不包括下划线“_”并将字符数限制为 30 我正在尝试这个,但这不起作用任何人都可以告诉我我是什么我做错了!此代码甚至将特殊字符作为字母数字值。$currLine = 'Kapil@ 123' 这不应该是一个有效值。

** 道歉 $currLine = "regex" 我的意思是 $currLine =~ "regex"

if ($currLine = /^[a-zA-Z0-9]{1,30}$/){
say "Line3 Good: ", $currLine;
} else {
say "Error in Line 3: Name not alphamumeric "; 
}
4

4 回答 4

6
$currLine = /^[a-zA-Z0-9]{1,30}$/

方法

$currLine = $_ =~ /^[a-zA-Z0-9]{1,30}$/

你想用

$currLine =~ /^[a-zA-Z0-9]{1,30}$/

现在讨论其他问题。

  • 你不允许空格。(接下来的内容允许空格。如果您特别指的是 SPACE,请使用它而不是\s)。
  • 您允许尾随换行符。
  • 如果第 31 个是换行符,则允许 31 个字符。
  • 您禁止使用许多字母数字字符。
  • 你禁止零个字符。

$currLine =~ /^[\p{Alnum}\s]{0,30}\z/
于 2013-10-22T17:12:33.623 回答
6

=在应该拥有=~(绑定)的地方使用(分配)。

启用警告可能已经提醒您注意这一点。您拥有的代码正在匹配$_,然后将匹配结果分配给$currLine.

于 2013-10-22T16:39:47.560 回答
2

为了使您的正则表达式匹配所有alphanumeric values包括spaces,您需要在字符类中包含空格。您还应该使用绑定运算符=~而不是=此处。

if ( $currLine =~ /^[a-z0-9\s]{1,30}$/i ) { ...

注意:我包含了i不区分大小写匹配的修饰符。

于 2013-10-22T17:06:29.320 回答
1

您正在使用赋值运算符(=)而不是匹配运算符(=~)。您应该将if语句更改为:

if ($currLine =~ /^[a-zA-Z0-9]{1,30}$/)

这也可以缩短为:

if ($currLine =~ /^[^\W_]{1,30}$/)

[^\W]已经匹配除\w. 要丢弃_,我们将其添加到否定字符类中,因此使用 - [^\W_]。但是请注意,这不仅仅匹配[a-zA-Z0-9]. 它包括属于单词字符的其他 unicode 字符。要仅允许该正则表达式考虑 ASCII 文本,请添加/a字符集修饰符

/^[^\W_]{1,30}$/a
于 2013-10-22T16:39:21.900 回答