繁体   English   中英

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

[英]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) 仅当我们匹配的对象后面没有Hallohay这才基本匹配。 在这种情况下,我们匹配<因此完整表达式变为<(?!Hallo|hay)

现在,我们只需要通过动态创建正则表达式来说明动态ValidList 我们使用string.Formatstring.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM