连接特殊字符“ - ”的相邻字符

时间:2012-02-08 09:39:51

标签: c# .net regex string

我正在使用c#.net开发一个应用程序,其中我需要如果用户输入的输入包含字符' - '(连字符),那么我希望连字符( - )的直接邻居被连接,例如用户输入

A-B-C then i want it to be replaced with ABC
AB-CD then i want it to be replaced like BC
ABC-D-E then i want it to be replaced like CDE
AB-CD-K then i want it to be replaced like BC and DK both separated by keyword and

获得此项后,我必须准备我的查询到数据库。

我希望我能清楚地解决这个问题,但如果需要进一步澄清,请告诉我。 任何帮助将不胜感激。

谢谢, Devjosh

4 个答案:

答案 0 :(得分:4)

使用:

string[] input = {
                        "A-B-C",
                        "AB-CD",
                        "ABC-D-E",
                        "AB-CD-K"
                    };

var regex = new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled);

var result = input.Select(s => string.Concat(regex.Matches(s)
    .Cast<Match>().Select(m => m.Value)));

foreach (var s in result)
{
    Console.WriteLine(s);
}

输出:

ABC
BC
CDE
BCDK

答案 1 :(得分:3)

未经测试,但这应该可以解决问题,或者至少引导您朝着正确的方向前进。

private string Prepare(string input)
{
    StringBuilder output = new StringBuilder();
    char[] chars = input.ToCharArray();
    for (int i = 0; i < chars.Length; i++)
    {
        if (chars[i] == '-')
        {
            if (i > 0)
            {
                output.Append(chars[i - 1]);
            }
            if (++i < chars.Length)
            {
                output.Append(chars[i])
            }
            else
            {
                break;
            }
        }
    }
    return output.ToString();
}

如果希望每对在阵列中形成单独的对象,请尝试以下代码:

private string[] Prepare(string input)
{
    List<string> output = new List<string>();
    char[] chars = input.ToCharArray();
    for (int i = 0; i < chars.Length; i++)
    {
        if (chars[i] == '-')
        {
            string o = string.Empty;
            if (i > 0)
            {
                o += chars[i - 1];
            }
            if (++i < chars.Length)
            {
                o += chars[i]
            }
            output.Add(o); 
        }
    }
    return output.ToArray();
}

答案 2 :(得分:1)

如果我错了,请纠正我,但你必须要做的就是删除' - '?

像这样:

"A-B-C".Replace("-","");

答案 3 :(得分:1)

你甚至可以通过单行解决这个问题(虽然有点难看):

String.Join(String.Empty, input.Split('-').Select(q => (q.Length == 0 ? String.Empty : (q.Length > 1 ? (q.First() + q.Last()).ToString() : q.First().ToString())))).Substring(((input[0] + input[1]).ToString().Contains('-') ? 0 : 1), input.Length - ((input[0] + input[1]).ToString().Contains('-') ? 0 : 1) - ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-') ? 0 : 1));

首先它将字符串拆分为每个'-'上的一个数组,然后它只连接每个字符串的第一个和最后一个字符(如果只有一个字符串,则只连接唯一字符,如果只有一个字符,它就会保留空字符串那里没有任何东西),然后它将得到的可枚举连接到一个String。最后,如果它们不在所需的范围内,我们将删除第一个和最后一个字母。

我知道,这很难看,我只是说它有可能......

使用简单的

可能更好
new Regex(@"\w(?=-)|(?<=-)\w", RegexOptions.Compiled)

然后使用它..

编辑 @Kirill Polishchuk更快......他的解决方案应该有效..

编辑2

问题更新后,这里有一个片段可以解决问题:

        string input = "A-B-C";
        string s2;
        string s3 = "";
        string s4 = "";
        var splitted = input.Split('-');
        foreach(string s in splitted) {
            if (s.Length == 0)
                s2 = String.Empty;
            else
                if (s.Length > 1)
                    s2 = (s.First() + s.Last()).ToString();
                else
                    s2 = s.First().ToString();
            s3 += s4 + s2;
            s4 = " and ";
        }
        int beginning;
        int end;
        if (input.Length > 1)
        {
            if ((input[0] + input[1]).ToString().Contains('-'))
                beginning = 0;
            else
                beginning = 1;
            if ((input[input.Length - 1] + input[input.Length - 2]).ToString().Contains('-'))
                end = 0;
            else
                end = 1;
        }
        else
        {
            if ((input[0]).ToString().Contains('-'))
                beginning = 0;
            else
                beginning = 1;
            if ((input[input.Length - 1]).ToString().Contains('-'))
                end = 0;
            else
                end = 1;
        }
        string result = s3.Substring(beginning, s3.Length - beginning - end);

它不是很优雅,但它应该工作(虽然没有测试..)。它的工作方式几乎与上面的单线程相同......