0

1.2.3より大きいすべてのバージョンに一致させたいので foo 1\.([0-1]\.|2\.[0-3])、は明らかに機能しません。

4

5 に答える 5

1

さて、3つの部分があります:

  1. 1より大きい:

    [2-9]
    
  2. 1.2より大きい:

    1\.[3-9]
    
  3. 1.2.3 以上:

    1\.2\.[4-9]
    

それらを組み合わせる:

(?<=\s|^)([2-9]|1\.[3-9]|1\.2\.[4-9])

ただし、これは 1 桁のバージョンを想定しています。複数桁のバージョンの場合、次を使用できます。

(?<=\s|^)([2-9]|1\d|1\.[3-9]|1\.\d{2}|1\.2\.[4-9]|1\.2\.\d{2})
于 2012-05-24T15:10:10.347 に答える
0

どうですか

foo [1-9]*\.((([3-9]{1}[0-9]*\.[0-9]*)|([2]{1}[0-9]{1}\.[0-9]*))|([2-9]{1}[0-9]*\.([3-9]{1}[0-9}{1})|([4-9]{1}[0-9]*)))

コンパクトではありませんが、仕事をします

これを使って試すことができます

于 2012-05-24T15:25:58.430 に答える
0

このための複雑な正規表現を書く代わりに、(\d+)\.(\d+)\.(\d+) のような正規表現で個々の数値ab、およびcを抽出し、 ( a > 1のような式を使用します。 ) || ( b > 2) || ( c > 3) 比較を行います。ここで || 短絡 OR 演算子です。

于 2012-05-24T15:31:12.190 に答える
0

1.2.3 より大きいものが必要な場合は、前の桁が等しいかどうかを各桁で確認するだけで済みます。

foo 1\.(2\.[4-9]|[3-9]\.\d)|[2-9]\.\d\.\d

複数桁のバージョンを想定する場合、次のようなものを使用する必要があります

foo 1\.(2\.([4-9]|\d{2,})|([3-9]|\d{2,})\.\d+)|([2-9]|\d{2,})\.\d+\.\d+
于 2012-05-24T15:13:30.793 に答える
0

数字の意味に基づいて一致を生成しようとしています。正規表現は、セマンティクスではなく、構文の検証にのみ適しています。技術的には目標を達成するために正規表現を書くことはできますが (Joey はうまくいきます)、それは優れた設計というよりはハックにすぎません。

バージョン文字列の断片を整数に解析してから、それらを数学的に比較してみてください。たとえば、C# では次のようになります。

public bool IsV1Bigger() {
    string v1 = "1.3.2";
    string v2 = "1.2.3";

    if(v1 == v2) return false;

    string[] v1Array = v1.Split('.');
    string[] v2Array = v2.Split('.');

    if(Convert.ToInt32(v1Array[0]) < Convert.ToInt32(v2Array[0])) return false;
    else if(Convert.ToInt32(v1Array[0]) > Convert.ToInt32(v2Array[0])) return true;

    if(Convert.ToInt32(v1Array[1]) < Convert.ToInt32(v2Array[1])) return false;
    else if(Convert.ToInt32(v1Array[1]) > Convert.ToInt32(v2Array[1])) return true;

    if(Convert.ToInt32(v1Array[2]) < Convert.ToInt32(v2Array[2])) return false;
    else if(Convert.ToInt32(v1Array[2]) > Convert.ToInt32(v2Array[2])) return true;
}
于 2012-05-24T15:18:58.187 に答える