如果以List中的字符串开头,则替换字符串

时间:2017-08-01 11:27:00

标签: c# .net string

我有一个看起来像这样的字符串

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++;   
    }
}

3 个答案:

答案 0 :(得分:1)

给出我给出的解决方案正确的答案:

Regex.Replace(s, string.Format("<(?!{0})", string.Join("|", ValidList)), "?")

这(显然)使用正则表达式来替换<之前不需要的?个字符。为了识别这些字符,我们使用a negative lookahead表达式。对于示例单词列表,这将如下所示:(?!Hallo|hay)。只有当我们匹配的内容未跟Hallohay后,这才基本匹配。在这种情况下,我们匹配<,因此完整表达式变为<(?!Hallo|hay)

现在我们只需要动态创建正则表达式来考虑动态ValidList。我们在那里使用string.Formatstring.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));