2

我有一个字符串,我想搜索两组字符。第一个是“in”,第二个是“-in”。要搜索的短语是“in-in”。我想用8888替换 "in" 和用9999替换"-in" ,但我不知道如何不匹配最后的 "in" 部分。

这个字符串实际上是两个子字符串,一个“in”,另一个“-in”。我试过使用 string.Split,但这没有帮助。

关于 .NET 正则表达式的任何想法/方向是否可能基于替换 in 和 -in 以字符串88889999结束?现在,我似乎得到的只是8888-8888

4

4 回答 4

1

您可以使用环视断言来做到这一点:

(?<!-)\bin\b

in仅当它前面没有. 时才匹配-

-in\b

匹配-in

单词边界锚确保您不会意外匹配,bins或.intogain


解决方案:

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

基本上你想做以下事情:
1.首先在字符串“str”中搜索“in”,如果找到,替换为“8888”。
2.其次在字符串“str”中搜索“-in”,如果找到,替换为“9999”。

您的问题有两种解决方案:
Case1:您首先知道您将搜索“searchString1”和“searchString2”。
解决方案:在这种情况下,按照长度从最大字符串到最小字符串的顺序对字符串进行排序,然后依次替换。

Case2 :一开始您不知道要搜索的第二个字符串是什么(从您的评论看来是这种情况)。
解决方案:首先形成一个“inputString”中不存在的KEYWORD,用KEYWORD替换“searchString1”,然后搜索“searchString2 or -KEYWORD”,用第二个替换字符串替换,最后用第一个替换字符串替换KEYWORD .

于 2013-08-03T19:12:06.247 回答
0

如果表达式严格始终是 in-in,为什么不使用 Regex 的 MatchCollection ?"(in)(-in)",会让你得到 Match[1] = in 和 Match[2] = -in,你可以相应地替换它们

于 2013-08-03T18:46:08.313 回答
0

如果您的替换集不是无前缀的,那么您可能需要考虑在较短的替换之前执行较长的替换。在这种情况下,您首先要替换"-in""9999"然后替换"in""8888"

于 2013-08-03T18:31:04.130 回答