2017-08-01 60 views
0

字符串开始我有一个字符串,它看起来像这样替换字符串,如果在列表

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替代H?

我尝试使用的IndexOf找到<的位置,如果字符串后starsWith列表中的任何字符串的离开它。

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

'Regex.Replace(S,的String.Format( “<({0})?!” 的string.join( “|”,ValidList) ),“?”)' – poke

+0

但是在有这个字符串的情况下s =“<你好,它是我的

+1

你根本没有指定什么应该发生在不是一个词的前缀的<<处。你也没有举一个例子。你也没有提到我能想到的所有其他边缘案例。 – poke

回答

1

为了让我给一个评论它应有的答案解决方案:

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

这个(显然)使用正则表达式的?更换不需要<字符。为了识别这些字符,我们使用a negative lookahead表达式。对于示例单词列表,这看起来像这样:(?!Hallo|hay)。这只有在我们所匹配的产品没有跟随Hallohay时才会匹配。在这种情况下,我们匹配<,因此完整表达式变成<(?!Hallo|hay)

现在我们只需要通过创建正则表达式来动态地解释动态ValidList。那里我们使用string.Formatstring.Join

0

使用LINQ.It一种可能的解决分裂使用<并检查“字”以下(文本,直到找到一个空的空间)是在有效列表,加入<?相应的字符串。最后,它加入了一切:

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)); 
0

像这样的事情,而无需使用正则表达式或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));