2

私は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の個別のコマンドを模倣するようなものです。

これはある種の正規表現を使用していると確信していますが、頭を包んで個別の正規表現だけを取得することはできません。すべての倍数ではありません。

どんな助けでも大歓迎です。前もって感謝します。

4

2 に答える 2

2

正規表現と少しの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

まず、かなり単純な正規表現を使用してすべてのプレースホルダーを見つけます。数値検索の+後、数値の1つ以上のオカレンスが検出されるため、プレースホルダー0からnが検出されます。[0-9]

次の行は、個別の発生をカウントするものです。LINQ-to-Objects拡張機能を動作させるには、の各項目をmatches MatchCollectionキャストする必要があります。Matchその後Value、オブジェクトのプロパティを選択しMatch、個別の値をフィルタリングして、それらをカウントします。

于 2013-02-16T18:29:03.600 に答える
0

はい、正規表現を使用{\d+}して一致を行うことができますが、明確なリストが得られないのは正しいです。ただし、 Regex.Matchesによって返されるMatchコレクションをループし、を抽出し、 Distinct LinqメソッドをValue使用して、個別のエントリのリストを取得できます。

于 2013-02-16T18:02:16.880 に答える