2

文字列がどの程度一致しているかを判断し、最適なものを判断できるメカニズムを作成しようとしています。例えば:

入力:

AAAB, AACS, BBBB, ZZZZZ

4つのルール:

  1. AA*
  2. AAA*
  3. BB*
  4. *

出力:

AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4

これを正規表現で判断することは可能ですか?

4

4 に答える 4

1

Hej、私は次のコードを作成しました。

最初にすべての特殊文字を置き換えてから、一致するかどうかを確認します。一致する場合は、一致の大きさを判断する必要があります。これは、* 文字の横にある残りの文字を数えることによって行います。

 public Int32 GetMatchQuota(string d)
    {
        Int32 retval = -1;
        string regMask = String.Format("^{0}$", Destination.Replace(".", "\\.").Replace("*", ".*").Replace("%", "."));

        if (Regex.IsMatch(d, regMask, RegexOptions.IgnoreCase))
        {
            retval = regMask.Replace("*", string.Empty).Length;
            if (!regMask.Contains("*") || !regMask.Contains("%"))
            {
                retval += 1;
            }
        }

        return retval;
    }
于 2013-07-18T07:59:30.627 に答える
1

「最適な」正規表現などというものはありません。速度が必要な場合は、さまざまな正規表現をベンチマークして、どれが最速かを確認するしかありません。

更新: あなたが本当に欲しいものを見た後。これは正規表現では実行できません。通常のロジックを使用して実行する必要があります。

于 2013-07-15T14:29:39.913 に答える
0

あなたの例から、最も具体的なものを見つけたいだけのようです。

具体性の昇順で正規表現のリストを作成し、テスト ケースに対して複数のパスを実行することをお勧めします。最初に成功した正規表現が「最適」になります。

あなたが示した例では、次のように正規表現を注文できます。

  1. BB*
  2. AAA*
  3. AA*
  4. *

次に、たとえばテスト ケース AACS の場合、正規表現 1 または regex 2 には一致しないことがわかりますが、正規表現 3 には一致します。そこまでたどり着きました。

もちろん、これは使用している正規表現に依存し、正規表現の順序を自分で決める必要があります。

于 2013-07-15T14:41:54.380 に答える
0

正規表現ではありません。合うか合わないかだけです。「より良い」一致という概念はありません。ただし、事前に正規表現を知っていれば、どの正規表現がより厳密であるかを判断できます。

それぞれに一致するかどうかを確認してから、最も厳密な一致を選択してください。あなたの例に関して:

2 > (1 = 3) > 4

一致する場合2は、それが最適です。 1同じものに一致することはあり3ませんが、同じように厳密です。 4は最も厳密ではないため、それが唯一の一致である場合にのみ最適です。

于 2013-07-15T14:32:10.973 に答える