我有一个看起来像这样的字符串
s = "<Hello it´s me, <Hi how are you <hay"
和一个清单
List<string> ValidList= {Hello, hay}
我需要结果字符串像
string result = "<Hello it´s me, ?Hi how are you <hay"
因此结果字符串将以&lt;并将剩余的标记放到列表中,保留它,否则如果以&lt;但是,列出的名单是否取代了H?
我尝试使用 IndexOf 来查找&lt;的位置。如果 stars之后的字符串列表中的任何字符串都留下它。
foreach (var vl in ValidList)
{
int nextLt = 0;
while ((nextLt = strAux.IndexOf('<', nextLt)) != -1)
{
//is element, leave it
if (!(strAux.Substring(nextLt + 1).StartsWith(vl)))
{
//its not, replace
strAux = string.Format(@"{0}?{1}", strAux.Substring(0, nextLt), strAux.Substring(nextLt + 1, strAux.Length - (nextLt + 1)));
}
nextLt++;
}
}
答案 0 :(得分:1)
给出我给出的解决方案正确的答案:
Regex.Replace(s, string.Format("<(?!{0})", string.Join("|", ValidList)), "?")
这(显然)使用正则表达式来替换<
之前不需要的?
个字符。为了识别这些字符,我们使用a negative lookahead表达式。对于示例单词列表,这将如下所示:(?!Hallo|hay)
。只有当我们匹配的内容未跟Hallo
或hay
后,这才基本匹配。在这种情况下,我们匹配<
,因此完整表达式变为<(?!Hallo|hay)
。
现在我们只需要动态创建正则表达式来考虑动态ValidList
。我们在那里使用string.Format
和string.Join
。
答案 1 :(得分:0)
使用LINQ.It的可能解决方案使用<
拆分字符串并检查&#34;字&#34; (发现空白区域之前的文字)以下内容位于有效列表中,相应地添加<
或?
。最后,它加入了这一切:
List<string> ValidList = new List<string>{ "Hello", "hay" };
string str = "<Hello it´s me, <Hi how are you <hay";
var res = String.Join("",str.Split(new char[] { '<' }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => ValidList.Contains(x.Split(' ').First()) ? "<" + x : "?"+x));
答案 2 :(得分:0)
不使用RegEx或LINQ
这样的事情 string s = "<Hello it´s me, <Hi how are you <hay";
List<string> ValidList = new List<string>() { "Hello", "hay" };
var arr = s.Split(new[] { '<' }, StringSplitOptions.RemoveEmptyEntries);
for (int i = 0; i < arr.Length; i++)
{
bool flag = false;
foreach (var item in ValidList)
{
if (arr[i].Contains(item))
{
flag = false;
break;
}
else
{
flag = (flag) ? flag : !flag;
}
}
if (flag)
arr[i] = "?" + arr[i];
else
arr[i] = "<" + arr[i];
}
Console.WriteLine(string.Concat(arr));