2012-02-28 9 views
1

パターンが指定された文字列にどれだけぴったり一致するかを測定または比較するメカニズムはありますか?パターンでは、正規表現または類似のものを意味します。たとえば、文字列「foobar」と2つの正規表現「fooba」があります。および"。*"両方のパターンが文字列と一致します。それは "fooba"を決定することは可能ですか?指定された文字列に対して "。*"より適切なパターンですか?しかし、それは正規表現から来て、あなたがする必要がどのように正確な場所に依存するので、"fooba."がより具体的で、length("fooba.") > length(".*") ...「一致」を測定しますか?

:あなたの正規表現の長さを使用してください:どのような考え方については、この程度

答えて

0

文字列「距離」の指標とヒューリスティックがあります。たとえば、これを確認してくださいhttp://en.wikipedia.org/wiki/Edit_distance

Google検索に付属しているランダムなJava実装です。

http://www.merriampark.com/ldjava.htm

いくつかの指標がとても辺りを見回すと、自分のニーズに合ったものを見つける計算するのに費用がかかります。あなたは

のようなものを使用ので、もし、あなたの具体的な例としては、IIRC、Javaで正規表現マッチングは、一致長による条件に優先順位を付け、その後、順番

「(foobarのを)|(。*)」は、最初にマッチします2つのキャプチャグループで返された結果を調べることで、これを判断できます。

+0

理解するためにはもっとコーヒーが必要ですが、デグには最も有望な方法のようです。ありがとうございました。 – jekamax

0

"fo.*|.*ba""fooba."より長くなりますので、解決策は必ずしも機能しません。

+0

残念ながら、 "foob"、 "foo。"、 "fo *。"通常一緒に来る。とにかく、簡単な最初のaproarchに感謝します。 – jekamax

+0

長さを比較する前に、アルファベット以外の文字を正規表現からいつも削除できると思います。 – beny23

+0

...または、特殊文字を重み付けするヒューリスティックを作成する。それはうまくいくかもしれない。 – jekamax

0

あなたが求めているのは、実際には正規表現のプロパティではありません。

"親密度"を測定する列挙型を作成し、与えられた正規表現と親密度を保持するクラスを作成します。これは、正規表現が他の正規表現と「近い」とみなされるかどうかを判断する必要があります。

さまざまなクラスをインスタンス化し、それらのコードを緩和させ、一致したオブジェクトを比較して、「最も近いもの」を上に上げます。

擬似コード、実際には何を比較するか、まともな言語に似ているなし:

enum Closeness 
    Exact 
    PrettyClose 
    Decent 
    NotSoClose 
    WayOff 
    CouldBeAnything 
mune 

class RegexCloser 
    property Closeness Close() 
    property String Regex() 
ssalc 


var foo = new RegexCloser(Closeness := Exact, Regex := "foobar") 
var bar = new RegexCloser(Closeness := CouldBeAnything, Regex := ".*") 

var target = "foobar"; 

if Regex.Match(target, foo) 
    print String.Format("foo {0}", foo.Closeness) 
fi 

if Regex.Match(target, bar) 
    print String.Format("bar {0}", bar.Closeness) 
fi 
+0

私のドメインでは、すべてのパターンはエンドユーザによって作成されます。私が理解できるように、これは、このaproarchでは、エンドユーザーが明示的にすべてのパターンを重み付けする必要があることを意味します。私はそれが適切であるとは思わない。 – jekamax

関連する問題