我有一个字符串,我想搜索两组字符。第一个是“in”,第二个是“-in”。要搜索的短语是“in-in”。我想用8888替换 "in" 和用9999替换"-in" ,但我不知道如何不匹配最后的 "in" 部分。
这个字符串实际上是两个子字符串,一个“in”,另一个“-in”。我试过使用 string.Split,但这没有帮助。
关于 .NET 正则表达式的任何想法/方向是否可能基于替换 in 和 -in 以字符串88889999结束?现在,我似乎得到的只是8888-8888
您可以使用环视断言来做到这一点:
(?<!-)\bin\b
in
仅当它前面没有. 时才匹配-
。
-in\b
匹配-in
。
单词边界锚确保您不会意外匹配,bins
或.into
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
基本上你想做以下事情:
1.首先在字符串“str”中搜索“in”,如果找到,替换为“8888”。
2.其次在字符串“str”中搜索“-in”,如果找到,替换为“9999”。
您的问题有两种解决方案:
Case1:您首先知道您将搜索“searchString1”和“searchString2”。
解决方案:在这种情况下,按照长度从最大字符串到最小字符串的顺序对字符串进行排序,然后依次替换。
Case2 :一开始您不知道要搜索的第二个字符串是什么(从您的评论看来是这种情况)。
解决方案:首先形成一个“inputString”中不存在的KEYWORD,用KEYWORD替换“searchString1”,然后搜索“searchString2 or -KEYWORD”,用第二个替换字符串替换,最后用第一个替换字符串替换KEYWORD .
如果表达式严格始终是 in-in,为什么不使用 Regex 的 MatchCollection ?"(in)(-in)",会让你得到 Match[1] = in 和 Match[2] = -in,你可以相应地替换它们
如果您的替换集不是无前缀的,那么您可能需要考虑在较短的替换之前执行较长的替换。在这种情况下,您首先要替换"-in"
为"9999"
,然后替换"in"
为"8888"
。