如何在字符串中的某些字符出现后删除子字符串?

时间:2017-02-02 20:50:46

标签: c#

我的要求如下:

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#中执行此操作?

3 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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

答案 2 :(得分:0)

缺少您对所需内容的描述。如果我理解错误,请纠正我。

您需要找到模式"[].",然后删除此模式后的所有内容,直到下一个点.

如果是这种情况,我相信使用正则表达式可以轻松解决问题。

因此,模式"[]."可以用正则表达式写成 "\[\]\."

然后你需要找到这个模式之后的所有内容,直到下一个点:".*?\.".*?表示每个字符尽可能多次,但是以非贪婪的方式,即在第一个点停止点它发现)。

所以,整个模式将是:

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

并且您想要用“[]替换此模式的所有匹配项。” (即删除括号后直到点的匹配)。

所以你在Regex类中调用Replace方法:

var result = Regex.Replace(input, regexPattern, "[].");