将特殊字符"-"相邻的字符连接起来

6

我正在使用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

正则表达式是这里的答案([A-Z])-([A-Z]) - Tom
我该如何在C#字符串操作函数中使用它?@Tom,您能详细说明一下吗? - Devjosh
那么你希望 ABC-D-E 产生什么?CDDE 吗?这很令人困惑。 - Aliostad
@Aliostad 是的,你现在找到了问题所在。为什么会让人感到困惑,你介意告诉我吗? - Devjosh
1
Kirill Polishchuk提出的方法提供了一个很好的实现。 - Tom
谢谢大家的帮助。 - Devjosh
4个回答

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

正则表达式对此来说太过于复杂了。 - Zenexer
@Devjosh,你是什么意思?我提供了可以应用于不同字符串集的正则表达式。 - Kirill Polishchuk
@Zenexer,你确定吗?这是正则表达式的典型任务。 - Kirill Polishchuk
Kirill,你应该尽可能避免使用正则表达式。与手动编写代码相比,它们通常效率较低,在这种情况下,手动编写代码的量也不会太多。 - Zenexer
@kirilli 噢,对不起,我没有注意到那个。 - Devjosh
显示剩余2条评论

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();
}

它在某种程度上与@zenxer相似,但在一种情况下失败了。 "AB-CD-K,然后我希望将其替换为BC和DK,作为不同的字符串实例",特别是这一个。 - Devjosh
什么是独立的字符串实例? - Zenexer
1
使用第二种方法。它会给你一个字符串数组,然后你可以按照你想要的任何方式将它们组合在一起。如果你想在它们之间添加关键字,那么你可以这样做。 - Zenexer
@zenxer 感谢您的编辑和额外建议,我可以说现在我将使用您的代码使其正常工作。 - Devjosh

1

如果我错了,请纠正我,但是您只需要移除“-”符号就可以了吧?

像这样:

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

谢谢@steve,但我的字符串是由用户输入的,而且并不一定每个块只包含一个字符,它可能包含2个或3个,甚至可能包含n个字符,例如AB-C-D或ABC-D-E等。 - Devjosh

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

首先,它将字符串在每个'-'上拆分为数组,然后仅连接每个字符串的第一个和最后一个字符(如果只有一个,则仅连接一个字符,并且如果没有内容,则留下空字符串),然后将结果枚举连接到字符串中。最后,如果它们不在所需范围内,我们会剥离第一个和最后一个字母。

我知道,这很丑陋,但我只是想说这是可能的。

也许最好只使用简单的方法。

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

这不是非常优雅,但应该可以工作(尽管没有经过测试..)。它的工作方式几乎与上面的一行代码相同...


虽然这些方法看起来很优雅,但它们并不是最有效的。我可能会选择更有效率的路线,但这取决于应用程序。如果我已经在使用大量的正则表达式,为什么不再添加一个呢? - Zenexer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接