4

複数の一致が得られる正規表現があります。データセットの例は CSV ファイルで、各行は個別の一致です。

product,color,type,shape,size
apple,green,fruit,round,large
banana,yellow,fruit,long,large
cherry,red,fruit,round,small

したがって、マッチ #1 はリンゴ、グリーン、フルーツ、ラウンド、ラージ、マッチ #2 はバナナ、イエロー、フルーツ、ロング、ラージなどになります。

私の質問は、RegEx.Replace を使用する場合、「開始」一致を指定するにはどうすればよいですか (たとえば、この場合、2 番目の一致から開始したい)、その後の一致の数を指定するにはどうすればよいですか? これは単なる例です。他のシナリオでは、マッチ #4 などから始めたいと考えています。

RegEx.Replaceはこのようなものをサポートしているようですが、私のシナリオに当てはまるより良い例を探しています。

私が試してみました:

Dim r As New RegEx(pattern)
result = r.Replace(input, replace, 1, 2)

replace は、キャプチャされた値 (私の場合は $1) を含む文字列ですが、違いは見られませんが、すべての一致を 1 つの文字列で取得します。

助言がありますか?一致の数を取得するのと同じくらい簡単なことを望んでいて、For ループを使用するだけでした。

4

3 に答える 3

1

テキストの行を識別するためだけに正規表現を使用することはありません。CSVファイルを

Dim lines As String()

lines = File.ReadAllLines("path of the CSV file")

次に、このようにループします

For i As Integer = starting_match To last_match
    lines(i) = lines(i).Replace("old","new")
Next

そして、線をまとめて

Dim result As String
result = String.Join(System.Environment.NewLine, lines)

アップデート

混乱は、Replaceメソッドの開始位置が開始文字の位置を示しており、開始一致インデックスではないという事実に起因しています。したがって、この拡張メソッドを使用することをお勧めします

<System.Runtime.CompilerServices.Extension> _
Public Shared Function ReplaceMatches(regex As Regex,
                                      input As String, replacement As String, 
                                      countMatches As Integer, startAtMatch As Integer
                                     ) As String
    Dim matches As MatchCollection = regex.Matches(input)
    If startAtMatch >= matches.Count Then
        Return input
    End If
    Dim skippedMatch As Match = matches(startAtMatch - 1)
    Dim startAtCharacterPosition As Integer = skippedMatch.Index + skippedMatch.Length
    Return regex.Replace(input, replacement, countMatches, startAtCharacterPosition)
End Function

これで、次のように置き換えることができます。

Dim input As String = "aaa bbb ccc ddd eee fff"
Dim startAtMatch As Integer = 2 ' ccc
Dim countMatches As Integer = 3

Dim regex = New Regex("\w+")
Dim result As String = regex.ReplaceMatches(input, "XX", countMatches, startAtMatch)
Console.WriteLine(result) ' --> "aaa bbb XX XX XX fff"

( devloperFusionを使用してC#からVBに変換された例)

于 2012-12-19T19:10:14.497 に答える
1

見てみましょうRegex.Replace(string, string, MatchEvaluator)

http://msdn.microsoft.com/en-us/library/ht1sxswy.aspx

これにより、特定の一致のインデックスをチェックする MatchEvaluator を渡すことができるようになるため、この場合はindex == 1

于 2012-12-19T18:50:41.623 に答える
-2

次のコードはあなたを助けるかもしれません

http://msdn.microsoft.com/en-us/library/ms149475.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-3

Imports System.Collections

Imports System.Text.RegularExpressions

Module Example

    Public Sub Main()
        Dim words As String = "letter alphabetical missing lack release " + _
                              "penchant slack acryllic laundry cease"
        Dim pattern As String = "\w+  # Matches all the characters in a word."
        Dim evaluator As MatchEvaluator = AddressOf WordScrambler
        Console.WriteLine("Original words:")
        Console.WriteLine(words)
        Console.WriteLine("Scrambled words:")
        Console.WriteLine(Regex.Replace(words, pattern, evaluator,
                                        RegexOptions.IgnorePatternWhitespace))
    End Sub

    Public Function WordScrambler(ByVal match As Match) As String
        Dim arraySize As Integer = match.Value.Length - 1
        ' Define two arrays equal to the number of letters in the match. 
        Dim keys(arraySize) As Double
        Dim letters(arraySize) As Char

        ' Instantiate random number generator' 
        Dim rnd As New Random()

        For ctr As Integer = 0 To match.Value.Length - 1
            ' Populate the array of keys with random numbers.
            keys(ctr) = rnd.NextDouble()
            ' Assign letter to array of letters.
            letters(ctr) = match.Value.Chars(ctr)
        Next
        Array.Sort(keys, letters, 0, arraySize, Comparer.Default)
        Return New String(letters)
    End Function

End Module

' The example displays output similar to the following: 
'    Original words: 
'    letter alphabetical missing lack release penchant slack acryllic laundry cease 
'     
'    Scrambled words: 
'    etlert liahepalbcat imsgsni alkc ereelsa epcnnaht lscak cayirllc alnyurd ecsae
于 2012-12-19T19:12:24.037 に答える