-2

私は服のサイズフィールドを検証しており、S、M、XL、XXL などの数字と特定の「単語」のみを受け入れるようにしたいのですが、パターンに単語を追加する方法がわかりません。たとえば、有効なサイズである「2、5、23、S、XXXL」のようなものに一致させたいが、「2X3、SLX」のような文字のランダムな組み合わせには一致させたくない

人々は正規表現の解決策を提案していないので、これは正規表現を使用するより大きな検証方法の一部であると言うべきだと思います。利便性とコードの一貫性のために、これを正規表現で行いたいと思います。

ありがとう

4

6 に答える 6

1

それらが既知の値のセットである場合、正規表現がそれを行うための最良の方法であるかどうかはわかりません。しかし、これは基本的にあなたの値のブルートフォースマッチであり、それぞれに \b (単語境界) アンカーが付いた 1 つの正規表現です。

\b2\b|\b5\b|\b23\b|\bXXXL\b|\bXL\b|\bM\b|\bS\b
于 2012-07-29T17:41:07.860 に答える
0

ストレートな回答でなくてすみません。あなたの場合、regexpはやり過ぎかもしれません。必要に応じて、それを使用しないソリューションの方が保守性が高くなる可能性があります。

あなたがどの言語を使用しているか分からないので、ランダムに選択します。疑似コードの一部として扱うことができます。

PHP の場合:

function isValidSize($size) {
    $validSizeTags = array("S", "M", "XL", "XXL");
    $minimumSize = 2;
    $maximumSize = 23;

    if(ctype_digit(strval($size))) { // explanation for not using is_numeric/is_int below
        if($size >= $minimumSize && $size <= $maxiumSize) {
            return true;
        }
    } else if(in_array($size, $validSizeTags)) {
        return true;
    } else {
        return false;
    }
}

$size = "XS";
$isValid = isValidSize($size); // true

$size = 23;
$isValid = isValidSize($size); // true

$size = "23";
$isValid = isValidSize($size); // true, is_int would return false here

$size = 50;
$isValid = isValidSize($size); // false

$size = 15.5; 
$isValid = isValidSize($size); // false, is_numeric would return true here

$size = "diadjsa";
$isValid = isValidSize($size); // false

( orctype_digit(strval($size))の代わりに使用する理由は、最初のものは "15" のような文字列ではなく、実際の整数に対してのみ true を返すためです。2 番目のものは、整数だけでなくすべての数値に対して true を返します。ただし、を含む文字列に対しては true を返しますただし、整数の場合は false を返します。そのため、値をに送信する前に を使用して文字列に変換します。PHP の世界へようこそ。)is_intis_numericctype_digitstrvalctype_digits

このロジックを配置すると、この特定の製品のすべての有効なサイズを格納する構成ファイルまたはデータベースから、validSizeTags、maximumSize、および minimumSize を簡単に挿入できます。正規表現を使用すると、さらに厄介になります。

于 2012-07-29T17:36:55.703 に答える
0

これにより、空白または句読点で区切られた選択肢が 1 回以上受け入れられます。必要に応じて区切り文字クラスを拡張するのは簡単です。

^([Xx]{0,3}[SsMmLl]|[0-9]+)([ ,:;-]+([Xx]{0,3}[SsMmLl]))*$

正規表現として使用する前に、受け入れられたパターンを文字列に補間できれば、コードの重複を減らすことができます。

これは通常のegrepパターンです。正規表現の方言は言語によって異なるため、選択した言語 (PHP? 質問にこの情報を含めることをお勧めします) に合わせて調整する必要がある場合があります。

于 2012-07-29T19:23:06.137 に答える
0

思ったよりも難しいので、一致した個々の値を配列に保存し、それらを受け入れられた値と個別に照合することを考えています。私は次のようなものを使用します

[0-9]+|s|m|l|xl|xxl

一致を配列に格納します

次に、各配列要素をチェックし[0-9]+s|m|l|xl|xxlこれらのいずれかに一致する場合は有効です。もっと良い方法があるかもしれませんが、私はこれについてあまり長く考えることはできません

ご協力いただきありがとうございます

于 2012-07-29T18:53:51.283 に答える
0

JavaScript の例を次に示します。

var patt = /^(?:\d{1,2}|X{0,3}[SML])$/i;


patt.test("2");     // true
patt.test("23");    // true
patt.test("XXXL");  // true
patt.test("S");     // true
patt.test("SLX");   // false
于 2012-07-29T17:47:16.983 に答える
0

正規表現の代わりに配列メンバーシップを使用する

一部の問題は、別の方法でデータを表現することで対処しやすくなります。正規表現は強力ですが、明確に定義された固定値に主に関心がある場合は、配列メンバーシップ テストを使用した方がよい場合があります。たとえば、Ruby を使用すると、次のようになります。

sizes = %w[2 5 23 S XXXL].map(&:upcase)

size = 'XXXL'
sizes.include? size.to_s.upcase  # => true

size = 'XL'
sizes.include? size.to_s.upcase  # => false
于 2012-07-29T18:30:47.663 に答える