-3

s次の条件を満たす必要がある 10 進数 があります。

((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))){

intsは、実際には ASCII テーブルの 10 進数に基づいています。

上記の条件を正規表現形式に変換できますか?

4

2 に答える 2

3

はい、できます。しかし、あなたはすべきではありません。上記の条件は数値演算であるため、数値演算のままにしておくと、タイプセーフで高速で理解しやすくなります。

リストした条件は、次のように要約されます。

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)sC# 派なので、うまくいくかどうかはわかりません。その行の考え方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);
于 2012-05-20T16:09:51.997 に答える
0


範囲の大きな条件を重複のない正規表現クラスに解決する必要がある場合は、このようなユーティリティが機能します。
ユーティリティコードを埋め込むのか、文字クラスの結果だけを埋め込むのかわからない。

残念ながら、私はJavaの専門家ではありません。したがって、このユーティリティはPerlで書かれています。たぶん
、それをJavaに変換するか、単にクラスを生成するために使用することができます。

これはASCIIサンプルです。大きな条件を取り、連続した範囲の数値(この場合は0〜255)に対してテストし
、文字コードに基づいて文字列を生成してから、文字列を有効な文字まで操作します。クラス。

編集: 2つの区切り文字が必要です。$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]
于 2012-05-20T21:02:51.270 に答える