从C#中的字符串中删除变化的子字符串

时间:2013-11-27 20:00:24

标签: c# string text

我有一个文本文件,列出地址如下。

123 Fake Street City State, Zip
124 Fake Street City State, Zip
...

我写了一个C#程序,它修剪了开头的数字并过滤掉了街道(我正在寻找数据中的独特街道)。但是,当地址中有公寓时,他们会这样读。

123 Example Street Apt 12B City State, Zip
123 Example Street Apt 12C City State, Zip

使用我的代码编写方式(因为它查找完全唯一行),它不会消除这些公寓号。我想要做的是删除“apt”和仅跟随它的子串。问题是,这些公寓号码可以是任何长度。我将在下面的代码中删除apt +公寓号码?

if (line.ToLower.Contains(" apt "))
{
    //Remove apt + substring following it
}

4 个答案:

答案 0 :(得分:2)

由于您知道公寓号码后面会有空格,您可以这样做:

int aptStartIndex = line.ToLower().IndexOf(" apt ");
int aptEndIndex = line.IndexOf(" ", aptStartIndex + 5);
line = line.Substring(0, aptStartIndex) + line.Substring(aptEndIndex);

第一行找到“apt”字符串的开头。 第二行找到“apt”之后的下一个空格。 第三行将子字符串带到“apt”,并在“apt”之后的单词之后添加子字符串,有效地删除了两个单词。

我测试了它HERE

答案 1 :(得分:1)

您可以使用RegEx " Apt \w+ "删除apt及其后面的数字:

Regex.Replace("123 Example Street Apt 12C City State, Zip"
              ,@" Apt \w+"
              ,"" 
              ,RegexOptions.IgnoreCase)

答案 2 :(得分:1)

最好只使用正则表达式:

string result = Regex.Replace(input,
    @"apt\W[0-9]+[a-z]?\W", "", RegexOptions.IgnoreCase);

但是,如果公寓的单词可能会有所不同,那么正则表达式会变得更加复杂。

答案 3 :(得分:1)

这是一个例子,虽然正则表达式可能是最好的。

        if (line.ToLower().Contains(" apt "))
        {
            String[] sParts = line.Split(' ');
            string finishedLine = "";
            for(int i = 0; i < sParts.Length; i++)
            {
                if (sParts[i].ToLower().Equals("apt"))
                {
                    i++;
                }
                else
                {
                    finishedLine += sParts[i] + " ";
                }
            }
            line = finishedLine.Trim();
        }