Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接特殊字符的相邻字符“-&引用;_C#_.net_Regex_String - Fatal编程技术网

C# 连接特殊字符的相邻字符“-&引用;

C# 连接特殊字符的相邻字符“-&引用;,c#,.net,regex,string,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 replac

我正在使用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-B-C".Replace("-","");
使用:


未经测试,但这应该可以奏效,或者至少可以引导您朝着正确的方向前进

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();
}
私有字符串准备(字符串输入)
{
StringBuilder输出=新的StringBuilder();
char[]chars=input.ToCharArray();
for(int i=0;i0)
{
Append(chars[i-1]);
}
if(++i<字符长度)
{
output.Append(字符[i])
}
其他的
{
打破
}
}
}
返回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();
}
private string[]准备(字符串输入)
{
列表输出=新列表();
char[]chars=input.ToCharArray();
for(int i=0;i0)
{
o+=chars[i-1];
}
if(++i<字符长度)
{
o+=字符[i]
}
输出。添加(o);
}
}
返回输出.ToArray();
}

您甚至可以用一行代码解决这个问题(尽管有点难看):

首先,它将字符串拆分为每个
'-'
上的一个数组,然后它仅连接每个字符串的第一个和最后一个字符(如果只有一个字符,则仅连接该字符,如果没有,则保留空字符串),然后将生成的可枚举字符串连接到一个字符串。最后,如果第一个字母和最后一个字母不在需要的范围内,我们将它们去掉

我知道,这很难看,我只是说这是可能的

也许用一个简单的

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

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

谢谢@steve,但我的字符串是由用户输入的,不需要每个块只包含一个新字符,它可以包含2个或3个字符,也可以是n个字符,如AB-C-D或ABC-D-E等。正则表达式就是这里的答案([A-Z])-([A-Z])我应该如何在c#字符串操作函数中使用它?您是否可以在@TomSo中详细说明您希望
ABC-D-E
生成什么<代码>CD和
DE
?它是confusing@Aliostad是的,你现在碰到问题了。为什么会让人困惑?请您告诉我,Kirill Polishchuk提出的方法很好地实现了这一点。正则表达式在这方面做得太过分了。@Kirill Polishchuk谢谢,但它只是将问题限制在某一组字符串上。我想要一个通用的解决方案,我不能假设用户可能会使用什么字符和-的组合进入这个field@Devjosh你是什么意思?我提供了可以应用于不同字符串集的正则表达式。@Zenexer,你确定吗?这是典型的regexp任务。是的,基里尔。如果可能的话,应该避免使用正则表达式。与其他手动路由相比,它们通常效率低下,在本例中,手动路由的代码并不多。它的工作原理与@zenxer相近,但在一个案例中失败了“AB-CD-K,然后我希望它像BC和DK一样被替换为不同的字符串实例”这一个特别是你所说的单独的字符串实例是什么意思?使用第二种方法。它将为您提供一个字符串数组。然后,您可以根据需要将它们连接在一起。如果您想在它们之间添加关键字,您可以。@zenxer感谢您的编辑和额外建议,我现在可以说,我将使用您的代码使其工作。虽然这些方法看起来很优雅,但它们不是最有效的。我可能会选择更有效的路线,但这取决于应用程序。如果我已经使用了很多正则表达式,为什么不再添加一个呢?
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();
}
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)
        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);