2013-02-16 122 views
1

我正在研究vb.net實用程序,並遇到需要查找字符串內所有不同的字符串。如何計算字符串內的不同字符串vb.net

所以基本上我會有一個字符串,看起來像這樣。 1.875{0};10;0.25|1.875;9;0.25|{2}1.875;1.875;0.25|14.125;{1}1.875;0.25|{0}14.125;16.125{1};0.25|1.875;{0}16.125;0.25|1.875;9;0.25{2}|1.875;8;0.25

所以你可以看到我有這樣的字符串內這些字符{0},{1},{2}

但是也有各自的 「佔位符」 的倍數可以這麼說。

所以我需要幫助編寫將採取上面的字符串字符串,並以這個例子返回的3計數的功能,因爲有源字符串中3個不同的佔位符。它會在sql中模仿獨特的命令。

我敢肯定,這使用某種正則表達式,但我不能包圍我的頭來檢索只有不同的。不是所有的倍數。

任何幫助表示讚賞。提前致謝。

回答

1

LINQ statemnts使用正則表達式和LINQ的一點點就可以實現的方式期望的效果

Imports System.Text.RegularExpressions 
Imports System.Linq 

Private Function CountPlaceholders(source As String) As Integer 
    Dim matches As MatchCollection = Regex.Matches(source, "{[0-9]+}") 
    Return matches.Cast(Of Match)().Select(Function(m) m.Value).Distinct().Count() 
End Function 

首先,使用相當簡單的正則表達式查找所有佔位符。在[0-9]數字搜索之後的+將找到一個或多個數字,因此將找到佔位符0到n。

下一行是不同的事件。必須將matchesMatchCollection中的每個項目轉換爲Match才能使LINQ-to-Objects擴展運行。之後,您選擇Match對象的Value屬性,過濾不同的值並對它們進行計數。

+1

太棒了!非常感謝你。教我新的東西。 – joeb 2013-02-16 19:05:01

0

是的,你可以使用正則表達式{\d+}做比賽,但你是正確的,不會給你一個不同的列表。但是您可以遍歷Regex.Matches返回的Match集合,提取Value並使用Distinct Linq方法獲取不同條目的列表。

0

可以使用Split函數將字符串分割成字符串類型的單獨列表項。然後使用LINQ表達式來選擇列表項的第一個位置中的唯一值。

Const Original As String = "1.875{0};10;0.25|1.875;9;0.25|{2}1.875;1.875;0.25|14.125;{1}1.875;0.25|{0}14.125;16.125{1};0.25|1.875;{0}16.125;0.25|1.875;9;0.25{2}|1.875;8;0.25" 
Dim count = (From m As Match In Regex.Matches(Original, "{[0-9]+}") _ 
      Select m.Value).Distinct.Count 

您可以Distinct命令後結合Count命令,但我把他們分開這裏,所以它更容易步,確認它就是你想要的。

編輯 我一直堅信正則表達式可能是去這裏,看到鮑勃三菱商事的答案還是我在查詢語法

+0

如果有{10}怎麼辦? – Steve 2013-02-16 18:19:19

+0

我曾考慮過這個。無可否認,這是一種笨拙的方式去做所有事情,而不瞭解更多關於數據類型的信息,但正如我在上面添加的那樣,您可以檢查每個子字符串的第3個位置是否應該保留一個閉合大括號我們保存任何雙位數字 – KyleMit 2013-02-16 18:22:12

+0

嗯,好,但最後的選擇仍然錯過了兩位數。然而,雖然我不喜歡正則表達式可能在這裏它是唯一的出路 – Steve 2013-02-16 18:27:14