0

我需要为字符串编写正则表达式以仅匹配 [a-zA-z0-9-._,\s] 字符集。除了提到的字符集之外,它应该会引发错误。此外,字符串的长度只能是 30 个字符。我也实现了自动换行。但是,如果字符串不是提到的字符集,我将无法抛出错误。任何帮助将非常感激!

我的字符串看起来像:

   shubhwork1234  567$#@!%^&*()<>:"-,._abadcew

我的代码应该抛出一个错误 - 说明只允许 [a-zA-z0-9-._,\s] 字符集。

如果我的字符串低于 : 那么应该没有错误。

   shubhworkwwwwwwwww1234567-,._  abadcew

我的代码看起来像:

   #!/usr/bin/perl
   my $prodname;
   my $temp_str;
   my $space = ' '; # word wrap done usign space character
   $prodname = "shubhwork1234  567$#@!%^&*()<>:"-,._abadcew";
   print (Product name not specified-name 1\n) unless($prodname);
   print "\n Product name is : $prodname";

   # For Product name , only 30 characters are allowed.
   print "\nLength of product name : ",length($prodname),"\n";    
   if(length($prodname) > 30)
   {
        print "\n Hello world";
            $temp_str = substr($prodname,0,40);
            print qq| Length of Product Name can be 40 characters.Terminating rest of the string\n|);

  #Handling xml special characters >,<,&,",'
     $temp_str =~ s/&/&amp;/g; 
     $temp_str =~ s/</&lt;/g;
     $temp_str =~ s/>/&gt;/g;
     $temp_str =~ s/"/&quot;/g;
     $temp_str =~ s/'/&apos;/g;
     $temp_str =~ s/[\x00-\x08\x0B\x0C\x0E-\x19]//g;

     # Word wrap
     my $rindx = rindex($temp_str,$space);
     $temp_str = substr($temp_str,0,$rindx);
     print "\n Sting temp is : $temp_str";

     #Here I ma not able to use negate properly for the character set. 
     if ($temp_str =~ m/^[a-zA-Z0-9]-._,\s*/)
     {
        print (qq| For product name : Invalid Input : Only [a-zA-Z0-9-._,] and spaces are allowed\n|);
     }                  
       $prodname = $temp_str; 
      print "\n assigning string is :",$prodname;
     }
4

2 回答 2

1

在错误的位置关闭方括号,你忘记了尾随\z,你忘记了否定。

if ($temp_str !~ /^[a-zA-Z0-9-._,\s]*\z/)  # Doesn't consist of good characters

或者你可以使用

if ($temp_str =~ /[^a-zA-Z0-9-._,\s]/)  # Contains a non-good character

注意\s匹配多个不同的空白字符,而不仅仅是空格。

于 2013-10-31T03:40:16.060 回答
1

由于您还想检查长度,因此无需否定它。您可以检查整个字符串是否包含 30 个或更少的允许字符:

/\A[a-zA-z0-9-._,\s]{0,30}\z/
于 2013-10-31T04:39:54.697 回答