2017-02-02 3 views
1

У меня есть требование следующим образом:Как удалить подстроку после появления определенных символов в строке?

input => "Employee.Addresses[].Address.City" 
output => "Empolyee.Addresses[].City" 
(Address is removed which is present after [].) 

input => "Employee.Addresses[].Address.Lanes[].Lane.Name" 
output => "Employee.Addresses[].Lanes[].Name" 
(Address is removed which is present after []. and Lane is removed which is present after [].) 

Как это сделать в C#?

+1

что "немедленно"? что происходит с несколькими скобками? Вопрос не ясен вообще – trailmax

ответ

1
private static IEnumerable<string> Filter(string input) 
{ 
    var subWords = input.Split('.'); 
    bool skip = false; 

    foreach (var word in subWords) 
    { 
     if (skip) 
     { 
      skip = false; 
     } 
     else 
     { 
      yield return word; 
     } 

     if (word.EndsWith("[]")) 
     { 
      skip = true; 
     } 
    } 
} 

А теперь использовать его как это:

var filtered = string.Join(".", Filter(input)); 
0

Эта функция обрезает любой сегмент сразу же после того, как пара в [] кронштейна.

public static String trimPostBrackets(string s){ 
     List<String> sp = new List<String>(s.Split('.')); //Separate it by segment 
     for(int i=0;i<sp.Count;i++)      //For each segment... 
      if(sp[i].EndsWith("[]") && i+1 < sp.Count) //If it ends with "[]" and there's a following segment... 
       sp.RemoveAt(i+1);       //Remove the following segment 
     return String.Join(".",sp);      //Put the surviving segments back together and return them 
    } 
1

Как насчет регулярного выражения?

Regex rgx = new Regex(@"(?<=\[\])\..+?(?=\.)"); 
string output = rgx.Replace(input, String.Empty); 

Объяснение:

(?<=\[\])   //positive lookbehind for the brackets 
     \.   //match literal period 
      .+?  //match any character at least once, but as few times as possible 
       (?=\.) //positive lookahead for a literal period 
+1

это работает, но косые черты должны быть экранированы, поэтому вы получаете что-то вроде этого: 'Regex rgx = new Regex (" (? <= \\ [\\]) \\ .. *? (? = \\.) ");' – awh112

+1

Строка помечена как текстовый строковый литерал, слэши в порядке – ColinM

+2

@ColinM На самом деле не во время его комментария. – Setsu

0

Ваше описание того, что вам нужно не хватает. Пожалуйста, поправьте меня, если я это неправильно понял.

Вам нужно найти шаблон "[]." и затем удалить все после этого шаблона до следующей точки .

Если это так, я считаю, с помощью регулярных выражений может решить эту проблему легко.

Таким образом, шаблон "[]." можно записать в регулярном выражении, как "\[\]\."

Тогда вам нужно найти все, что после того, как этот шаблон до следующей точки: ".*?\." (The .*? означает каждый символ столько раз, сколько это возможно, но неживым способом, т. е. останавливаться в первой точке, которую он находит).

Таким образом, вся картина будет выглядеть так:

var regexPattern = @"\[\]\..*?\."; 

И вы хотите заменить все матчи этой модели с «[].» (т. е. удаление совпадений после скобок до точки).

Так вы называете Replace метод в Regex классе:

var result = Regex.Replace(input, regexPattern, "[]."); 
Смежные вопросы