2

2 つの文字セットを検索したい文字列があります。1 つ目は "in" で、2 つ目は "-in" です。検索する語句は「in-in」です。「in」を8888に、「-in」を9999に置き換えたいのですが、最後の「in」部分を一致させない方法がわかりません。

この文字列は、実際には "in" と "-in" の 2 つの部分文字列です。string.Split を使用してみましたが、役に立ちません。

in と -in の両方を置き換えることに基づいて文字列88889999になる可能性がある場合、.NET 正規表現に関する考え/方向性はありますか? 今、私が手に入れているのは8888-8888だけです

4

4 に答える 4

1

ルックアラウンド アサーションを使用してこれを行うことができます。

(?<!-)\bin\b

inが前に付いていない場合にのみ一致し-ます。

-in\b

一致し-inます。

単語境界アンカーにより、誤ってbinsintoまたはに一致しないことが保証されますgain


解決:

Sub TestRegExSubstition()
    Dim searchDictionary As New List(Of KeyValuePair(Of String, String))
    searchDictionary.Add(New KeyValuePair(Of String, String)("in", "8888"))
    searchDictionary.Add(New KeyValuePair(Of String, String)("-in", "9999"))

    Dim sentenceArray = {"in-in",
                         "in Parvin-e",
                         "Parvin-in",
                         "in in-e",
                         "Parvin injā-in"}

    For i = 0 To UBound(sentenceArray)
        Dim input As String = sentenceArray(i)
        For Each kvp In searchDictionary
            Dim regex As Regex = New Regex("(?<!-)\b" + kvp.Key + "\b")
            input = regex.Replace(input, kvp.Value)
        Next
        Console.WriteLine(input)
    Next
    Console.ReadLine()
End Sub
于 2013-08-03T19:44:19.480 に答える
0

式が厳密に常に in-in である場合、Regex の MatchCollection を使用しないのはなぜですか? "(in)(-in)" を使用すると、Match[1] = in および Match[2] = -in を取得でき、それに応じてそれらを置き換えることができます

于 2013-08-03T18:46:08.313 に答える
0

基本的には次のようにします。
1. 最初に文字列 "str" で "in" を検索し、見つかった場合は "8888" に置き換えます。
2. 次に、文字列「str」で「-in」を検索し、見つかった場合は 9999 に置き換えます。

この問題には 2 つの解決策があります。 ケース
1 : 最初は、"searchString1" と "searchString2" を検索することを知っています。
解決策: この場合、文字列を最大の文字列から最小の文字列の長さの順序で並べ替えてから、順番に置き換えます。

ケース 2 : 最初は、検索する 2 番目の文字列が何であるかわかりません (コメントからは、このように見えます)。
解決策: 最初に「inputString」に存在しない KEYWORD を形成し、「searchString1」を KEYWORD に置き換え、次に「searchString2 または -KEYWORD」を検索し、2 番目の置換文字列に置き換え、最後に KEYWORD を最初の置換文字列に置き換えます。 .

于 2013-08-03T19:12:06.247 に答える