【问题标题】:Concatenate neighboring characters of a special character "-"连接特殊字符“-”的相邻字符
【发布时间】:2012-02-29 17:40:28
【问题描述】:

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

得到这个之后,我必须准备我的数据库查询。

我希望我把问题说清楚了,但如果需要更多说明,请告诉我。 任何帮助将不胜感激。

谢谢, 德约什

【问题讨论】:

  • 正则表达式是这里的答案 ([A-Z])-([A-Z])
  • 我应该如何在 c# 字符串操作函数中使用它你能详细说明一下吗@Tom
  • 那么你希望ABC-D-E 产生什么? CDDE?令人困惑
  • @Aliostad 是的,您现在遇到了问题。你介意告诉它为什么令人困惑
  • Kirill Polishchuk 提出的方法很好地实现了这一点。

标签: c# .net regex string


【解决方案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

问题更新后,这里有一个可以解决问题的 sn-p:

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

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

【讨论】:

  • 虽然这些方法看起来很优雅,但它们并不是最有效的。我可能会采取更有效的路线,但这取决于应用程序。如果我已经使用了很多正则表达式,为什么不再添加一个呢?
【解决方案2】:

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

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 一样被替换为不同的字符串实例”这一点特别跨度>
  • 单独的字符串实例是什么意思?
  • 使用第二种方法。它会给你一个字符串数组。然后,您可以根据需要将它们连接在一起。如果你想在它们之间添加关键字,你可以。
  • @zenxer 感谢您的编辑和额外建议,我现在可以说,我将使用您的代码使其工作
【解决方案3】:

用途:

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

【讨论】:

  • 正则表达式对此太过分了。
  • @Kirill Polishchuk 谢谢,但它只将问题限制在一组字符串我想要一个通用的解决方案我不能假设字符的组合和 - 用户可以在这个字段中输入
  • @Devjosh,你什么意思?我提供了可以应用于不同字符串集的正则表达式。
  • @Zenexer,你确定吗?这是正则表达式的典型任务。
  • 积极,基里尔。如果可能的话,你应该避免使用正则表达式。与替代的手动路线相比,它们通常效率低下,在这种情况下,这并不是更多的代码。
【解决方案4】:

如果我错了,请纠正我,但您肯定需要做的就是删除“-”吗?

像这样:

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

【讨论】:

  • 谢谢@steve,但我的字符串是由用户输入的,每个块不必包含onw字符,它可能包含2或3个字符,或者可能是n个字符,如AB-CD或ABC- DE等
猜你喜欢
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 2016-07-31
  • 2017-04-02
  • 1970-01-01
相关资源
最近更新 更多