2012-02-10 40 views
4

正規表現は、テキストの先頭から単語に一致します。正確な単語が入力された場合、それは一致しますが、一致する文字のある特定の最小数、にも一致します。ただし、追加の文字もと一致している必要があります。例えば最小の文字数を受け入れる正規表現フレーズに一致する正規表現

、私は「サンフランシスコ」と一致しようとしているが、ドメインで一意に識別するのに十分なよう最初の5つの文字を受け入れて喜んでいた場合:

  • マッチ:サンフランシスコ
  • マッチ:サンF
  • マッチ:サンフラ
  • マッチ:サンフランシスコ blahblah
  • 失敗:ボストン
  • 失敗:サンディエゴ
  • 失敗:サンFransisko
  • 失敗:サンFrano
この ほとんど作品

が、間違って最後の2試合:私は、.NET正規表現を使用していますが、任意の言語での解決策がどうなる

^San Fr?a?n?c?i?s?c?o? 

答えて

3

あなたが抱えている問題は、グループの一つです。

^San F(r(a(n(c(i(s(c(o)?)?)?)?)?)?)?)? 

括弧は、許可される 'a'が前の 'r'などに依存するようにします。サンフランシスコとサンフランシスコではまだマッチしますが、マッチはサンフランシスコブラフラのような「サンフラン」だけです。

4

正規表現にする必要はありますか?簡単な文字列比較を行うのがはるかに簡単です。

bool matches(string input, string phrase, int minimumLength) 
{ 
    int compareLength = Math.Min(input.Length, phrase.Length); 
    return input.Length >= minimumLength 
     && input.Substring(0, compareLength) == phrase.Substring(0, compareLength); 
} 

それはその後、正規表現でなければならない場合は

...

"^San F(r(a(n(c(i(s(c(o.*)?)?)?)?)?)?)?)?$" 
0

それが正規表現にする必要がある場合、これは動作します:

(^San Fr)(ancisco.*|ancisc|ancis|anci|anc|an|a)?\b 

xと| yの - マッチxまたはyのどちらか。たとえば、 "z | wood"は "z"または "wood"と一致します。 "(z | w)oo"は "動物園"または "木"にマッチします。

\ b - 単語境界、つまり単語とスペースの間の位置に一致します。たとえば、 "er \ b"は "never"の "er"と一致しますが、 "動詞"の "er"は ではありません。

これは、一致するものがあれば、そのフレーズ全体が一致するようになります。 San Franoなどの部分一致はありません。

あなたはabove example at Regexrで遊ぶことができます:

0

をたぶんあなたがここに必要なものを、単純な正規表現ではなく、距離を計算するための方法または2与えられた文字列の類似性にも?

もしそうなら、Levensteinのアルゴリズムを見て、文字列間の距離を計算してください。

これは役に立ちますか?

関連する問題