Regex可以支持找不到东西吗?

时间:2013-08-03 18:20:10

标签: c# .net regex vb.net

我有一个字符串,我想搜索两组字符。第一个是“in”,第二个是“-in”。搜索的短语是“in-in”。我想用 8888 替换“in”,用 9999 替换“-in”,但我无法弄清楚如何不匹配最后的“in”部分。< / p>

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

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

4 个答案:

答案 0 :(得分:1)

您可以使用lookaround assertions执行此操作:

(?<!-)\bin\b

仅在in之前没有匹配-

-in\b

匹配-in

word boundary anchors确保您不会意外地匹配binsintogain


解决方案:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果表达式严格总是在in-in中,为什么不使用正则表达式的MatchCollection? “(in)( - in)”,会让你得到Match [1] = in和Match [2] = -in,你可以相应地替换它们

答案 3 :(得分:0)

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

您的问题有两种解决方案:
案例1:您首先要知道您要搜索“searchString1”和“searchString2” 解决方案:在这种情况下,按照从最大字符串到最小字符串的长度顺序排序字符串,然后依次替换
案例2:您首先不知道要搜索的第二个字符串是什么(从您的评论看起来就是这种情况)。
解决方案:首先形成一个KEYWORD,它不存在于“inputString”中,用KEYWORD替换“searchString1”,然后搜索“searchString2或-KEYWORD”,替换为第二个替换字符串,最后用第一个替换字符串替换KEYWORD