【问题标题】:Can Regex support not finding something?正则表达式可以支持找不到东西吗?
【发布时间】:2013-08-03 18:20:10
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否将“-in”替换为 9999 作为一个操作,然后将“in”替换为 8888 作为第二个操作?
  • 试着向前看,向后看。我通常用 Autohotkey 做 Regex,这里的文档应该可以帮助你在 .net 中做到这一点。 autohotkey.com/docs/misc/RegEx-QuickRef.htm
  • @576i,这可能正是我想要的。我会更详细地检查一下。
  • @Brandon,向后搜索已经结束。请参阅下面的评论。
  • 没有引号的 "(?

标签: c# .net regex vb.net


【解决方案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

【讨论】:

  • Tim,这太棒了,正是我所需要的,尤其是防止意外匹配。我已经编辑了您的,以便将 VB.NET 解决方案放在这里供其他人使用。
【解决方案2】:

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

【讨论】:

  • 抱歉,由于搜索/替换的顺序是固定的,我将无法对这些进行向后搜索。
  • 向后搜索?这只是使用string.Replace的简单替换!
  • 要搜索的第一个词是“in”。第二个是“-in”!
  • 不能更改替换顺序?
  • 不,我不能。但正如@576i 指出的那样,我也许可以做一个前瞻。我现在正在研究。
【解决方案3】:

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

【讨论】:

  • 它并不总是严格的“in-in”。它可能是“inja-in”或“in-e”或其他任何东西。这不是一个解决方案,它应该是上面的评论。
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 2014-09-07
    • 2010-10-06
    • 1970-01-01
    • 2017-03-28
    • 2016-03-04
    • 2013-08-17
    • 2020-10-13
    • 1970-01-01
    相关资源
    最近更新 更多