文字列がどの程度一致しているかを判断し、最適なものを判断できるメカニズムを作成しようとしています。例えば:
入力:
AAAB, AACS, BBBB, ZZZZZ
4つのルール:
- AA*
- AAA*
- BB*
- *
出力:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
これを正規表現で判断することは可能ですか?
文字列がどの程度一致しているかを判断し、最適なものを判断できるメカニズムを作成しようとしています。例えば:
入力:
AAAB, AACS, BBBB, ZZZZZ
4つのルール:
出力:
AAAB -> 2, AACS -> 1, BBBB -> 3, ZZZZZ -> 4
これを正規表現で判断することは可能ですか?
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;
}
「最適な」正規表現などというものはありません。速度が必要な場合は、さまざまな正規表現をベンチマークして、どれが最速かを確認するしかありません。
更新: あなたが本当に欲しいものを見た後。これは正規表現では実行できません。通常のロジックを使用して実行する必要があります。
あなたの例から、最も具体的なものを見つけたいだけのようです。
具体性の昇順で正規表現のリストを作成し、テスト ケースに対して複数のパスを実行することをお勧めします。最初に成功した正規表現が「最適」になります。
あなたが示した例では、次のように正規表現を注文できます。
次に、たとえばテスト ケース AACS の場合、正規表現 1 または regex 2 には一致しないことがわかりますが、正規表現 3 には一致します。そこまでたどり着きました。
もちろん、これは使用している正規表現に依存し、正規表現の順序を自分で決める必要があります。
正規表現ではありません。合うか合わないかだけです。「より良い」一致という概念はありません。ただし、事前に正規表現を知っていれば、どの正規表現がより厳密であるかを判断できます。
それぞれに一致するかどうかを確認してから、最も厳密な一致を選択してください。あなたの例に関して:
2 > (1 = 3) > 4
一致する場合2
は、それが最適です。 1
同じものに一致することはあり3
ませんが、同じように厳密です。 4
は最も厳密ではないため、それが唯一の一致である場合にのみ最適です。