2017-07-06 8 views
0

を複製どのように多くの文字列内の部分文字列の出現カウントなしの数:は、私は用語や文字列のリストを持っているたとえば

var terms = { "programming language", "programming", "language" }; 

var content = "A programming language is a formal language that " 
    + "specifies a set of instructions that can be used to " 
    + "produce various kinds of output."; 

に表示され、私は4回のリストがあることをカウントするRegex.Matches(content, term).Countを使用することができます文字列:

  • "プログラミング言語":1時間
  • "プログラミング":1時間
  • "言語":2回

しかし、重複があるため、わずか2回発生する必要があります。

私の現在の解決策は、各オカレンスの開始インデックスと終了インデックスを保存し、範囲内で既にカウントされている場所に保存されたオカレンスと比較することです。開始インデックスと終了インデックスを使用しないと良い方法がありますか?

+1

正規表現をどのように構築しますか? '(プログラミング言語|プログラミング言語)'は、それが正しいとすれば、あなたが望むことをするはずです。 – Rawling

+0

あなたが以前に試したことを見せてください。 – HimBromBeere

+0

重複を数えないとどういう意味ですか?オカレンスを数えたいので、定義によって重複をカウントします。もっと説明できますか? –

答えて

1

コメントからの提案の後、私は正規表現を使用してsimple solutionが、それは、すなわちprogramming languageをカウントすることができ、正確な単語全体で動作するはずですが持ってprogramming languagesはできません:

var pattern = @"(?<!\S)programming language(?![^\s])|(?<!\S)programming(?![^\s])|(?<!\S)language(?![^\s])"; 
var count = Regex.Matches(content, pattern).Count; 

注:このパターンにのみ使用することができたときにprogramming languageprogrammingおよびlanguageの前に配置されます。誰かがより良い解決策を提供できる場合は、そうしてください。

+0

おそらく '(?<!\ S)'や '(?![^ \ s])'の代わりに '\ b'を使って単語の端を検出することができます。それ以外に、あなたが残しておいたのは、検索用語を自動的に並べる方法を見つけることです。 – Rawling

+0

@Rawling私はregexで新しく、 '\ b'を使ってエッジを検出する例を書けますか? – MiP

+1

'\ b(xy | y | z)\ b'のようなものです。 '\ b'は単語文字(文字、数字、アンダースコア)と単語以外の文字(それ以外の文字)の間のポイントに一致します。 – Rawling

関連する問題