【问题标题】:How can I define a regex format? [closed]如何定义正则表达式格式? [关闭]
【发布时间】:2012-05-20 15:36:14
【问题描述】:

我有一个十进制数s,它需要满足以下条件:

((s>=97 && s<=122 )&&(s>=65 && s<=90)&&(s>=48 && s<=57)&&
((s>=33 && s<=47)||(s>=58 && s<=64)||(s>=91 && s<=96)||(s>=123 && s<=126))){

int s实际上是基于ASCII表的十进制数。

上面的条件可以转换成regex格式吗?

【问题讨论】:

  • 你的问题没有答案...
  • 为什么是正则表达式?为工作使用正确的工具。
  • 我想过滤用户输入的密码,使密码由大小写字母、数字和符号组成……以上条件是基于ASCII表的,但我想创建满足要求的正则表达式模式...
  • 您的情况也有错误:s 不能介于 97 和 122 之间,也不能介于 65 和 90 之间。
  • 我认为这个问题的编辑版本值得保持开放。

标签: java android regex


【解决方案1】:

是的,你可以。但你不应该。上述条件是数值运算,因此如果您将它们保留为数值运算,它们将是类型安全、快速且易于理解的。

您列出的条件归结为如下:

if (s >= 33 && s <= 126) {
    switch ((int)s) {    
        case 47:
        case 57:
        case 64:
        case 90:
        case 97:
        case 122:
            return s == (int)s;
        default: 
            return true;    
    }
}
return false;

我不确定 s == (int)s 会飞,因为我是 C# 人。该行的想法是,如果s 是一个整数,则返回 true,否则返回 false。

简短而甜蜜的选择:

float[] temp = new float[] { 47, 57, 64, 90, 97 };
return s >= 33 && s <= 126 && (!temp.contains((int)s) || s == (int)s);

以上是执行此操作的“正确”方法。如果你必须使用正则表达式,你可以这样做:

String pattern = "([459]7|64|90|122)\\.[0-9]+";
return s >= 33 && s <= 126 && !s.toString().matches(pattern);

【讨论】:

    【解决方案2】:

    如果您需要将大量范围条件解析为正则表达式类
    没有重叠,这样的实用程序将起作用。不确定是否要嵌入
    实用程序代码或只是字符类结果。

    很遗憾,我不是 Java 专家。所以这个实用程序是用 Perl 编写的。也许你
    可以将其转换为 Java 或仅使用它来生成类。

    这是一个 ASCII 样本,它只需要一个很大的条件,并针对一个连续的数字范围(在本例中为 0 - 255)进行测试,生成一个字符串
    基于字符代码,然后将字符串向下操作为有效的字符类。

    编辑:需要两个分隔符; $pad 和 $range,它们应该在条件中可能有效的范围之外。

    祝你好运!

    $class = '';
    $valid = 0;
    $pad   = "\x{100}";
    $range = "\x{101}";
    
    for $s (0 .. 255)
    {
       if (   ($s >= 33  && $s <= 47)
           || ($s >= 58  && $s <= 64)
           || ($s >= 91  && $s <= 96)
           || ($s >= 123 && $s <= 140)
           || ($s >  4   && $s <  25)
           || ($s >  180)
           || ($s == 0)
      )
       {
          $class .= chr($s);
          $valid = 1;
          # print $s,"\n";
       }
       else {
          $class .= $pad;
       }
    }
    
    if ( $valid)
    {
       # Escape special class characters
          $class =~ s/([\[\]\-\^\\])/\\$1/g;
    
       # Compact range, insert delimiter, then remove padding
          $class =~ s/(\\?[^$pad])[^$pad]+(\\?[^$pad])/$1$range$2/g;
          $class =~ s/[$pad]//g;
    
       # Convert non-printable ASCII characters to hex (does not process delimeter)
          $class =  join '', 
                  map { my $v = ord($_);
                        $v != ord($range) && ($v < 32 || ($v > 126 && $v < 256)) ?
                        sprintf("\\x%.2x", $v) : $_
                  } split (//, $class);
    
       # Insert range operator's
          $class =~ s/[$range]/-/g;
    
       # Print class
          $class = '[' . $class . ']';
          print "\nEquivalent class = ", $class, "\n";
    }
    
    else {
        print "\nNothing in range!\n";
    }
    

    输出 -

    Equivalent class = [\x00\x05-\x18!-/:-@\[-`{-\x8c\xb5-\xff]
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2017-11-13
      • 2015-04-27
      • 2016-09-28
      • 1970-01-01
      相关资源
      最近更新 更多