[英]Replace string if starts with string in List
我有一个看起来像这样的字符串
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"
因此,如果结果字符串以<开头,其余的字符串将保留到列表中,则将其保留,否则,如果结果以<开头但不是在列表中则将H替换为?
我尝试使用IndexOf来找到<的位置,以及如果starsWithList中的任何字符串后的字符串都离开它,则查找位置。
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++;
}
}
为了给出解决方案,我以评论的形式给出了正确的答案:
Regex.Replace(s, string.Format("<(?!{0})", string.Join("|", ValidList)), "?")
这(显然)使用正则表达式将不需要的<
字符替换为?
。 为了识别这些字符,我们使用否定的超前表达。 对于示例单词列表,它看起来像这样:( (?!Hallo|hay)
。 仅当我们匹配的对象后面没有Hallo
或hay
这才基本匹配。 在这种情况下,我们匹配<
因此完整表达式变为<(?!Hallo|hay)
。
现在,我们只需要通过动态创建正则表达式来说明动态ValidList
。 我们使用string.Format
和string.Join
。
可能的使用LINQ的解决方案。它将使用<
拆分字符串,并检查后面的“单词”(文本直到找到空白)是否在有效列表中,并添加<
或?
因此。 最后,它将所有内容结合在一起:
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));
不使用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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.