2017-07-06 37 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."; 

我可以用Regex.Matches(content, term).Count來算,有4次列表出現在字符串:

  • 「編程語言」: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 language放置在programminglanguage之前。如果有人能提供更好的解決方案,請這樣做。

+0

您可以使用'\ b'而不是'(?<!\ S)'或'(?![^ \ s])來檢測字邊緣。除此之外,你所要做的就是找到一種方法來自動排序搜索條件... – Rawling

+0

@Rawling我是新來的正則表達式,你能寫一個使用'\ b'來檢測邊緣的例子嗎? – MiP

+1

類似於'\ b(xy | y | z)\ b'。 '\ b'匹配單詞字符(字母,數字,下劃線)和非單詞字符(其他任何字符)之間的點。 – Rawling