【问题标题】:Split string at particular characters (C#)在特定字符处拆分字符串 (C#)
【发布时间】:2023-03-05 13:20:02
【问题描述】:

我想要做的是拆分一个数组,然后将我拆分的字符放入另一个元素

string text = "1*5+89-43&99"
应该变成
string[] textsplit = ["1","*","5","+","89","-","43","&","99"] (它必须是一个字符串) 我将提供要留在单独元素中的字符

【问题讨论】:

  • 只是一个问题:您如何确定此字符串中有 4 个元素? -43&99,而不是 3 或 2?
  • 你有什么办法解决你的问题,你的代码在哪里?
  • "-1+-2*-10.1*.1" 的输入会产生什么结果?
  • 这能回答你的问题吗? split string c# based on math operator 接受的答案显示了如何使用 Regex

标签: c# arrays string split


【解决方案1】:

您可以使用string.IndexOfAny 执行此操作。

只需继续寻找任何分隔符的下一个索引。找到分隔符后,将其与最后一个分隔符之间的文本添加到结果中,然后查找下一个分隔符。

string input = "1*1*5+89-43&33";
var separators = new[] { '+', '-', '*', '/', '&' };
var result = new List<string>();

int index;
int lastIndex = 0;
while ((index = input.IndexOfAny(separators, lastIndex)) != -1)
{
    // Add the text before the separator, if there is any
    if (index - lastIndex > 0)
    {
        result.Add(input.Substring(lastIndex, index - lastIndex));
    }
    
    // Add the separator itself
    result.Add(input[index].ToString());

    lastIndex = index + 1;  
}

// Add any text after the last separator
if (lastIndex < input.Length)
{
    result.Add(input.Substring(lastIndex));
}

【讨论】:

【解决方案2】:

试试下面的代码 sn-p:

        string text  = "1*1*5+89-43&33";
        List<string> textsplit = new List<string>();
        foreach(var match in Regex.Matches(text, @"([*+/\-)(])|([0-9]+)"))
        {
            textsplit.Add(match.ToString());
        }

结果添加为图像。

【讨论】:

  • 谢谢!以及如何检查更多符号,即^,因为我不熟悉 RegEx
  • 您能否为上述场景指定一个示例? @OmerHijazi 你是这个意思吗 - string text = "^1*1*5+89-43&33"; ?
  • 例如"1^5" 或类似的东西,以及如何包含十进制数字,即 "1*2^7-33.1" 应该变成 ['1','*','2','^','7', '-','33.1'] @ScareCrow nvm 我改为 ([*+/\-^())(])|([0-9.]+) 所以现在它也可以在单独的元素和小数中显示括号也。有点掌握它的窍门
  • 希望你得到答案。 @OmerHijazi @"([^*+/\-)(])|([0-9]+)" 这是用于处理 ^.
【解决方案3】:

这是一个基本的和幼稚的实现,我相信我们会做你想做的:

public static List<string> SplitExpression(string expression)
{
    var parts = new List<string>();
    
    bool isNumber(char c) => c == '.' || (c >= '0' && c <= '9');
    bool isOperator(char c) => !isNumber(c);

    int index = 0;
    while (index < expression.Length)
    {
        char c = expression[index];
        index++;

        if (isNumber(c))
        {
            int numberIndex = index - 1;
            while (index < expression.Length && isNumber(expression[index]))
                index++;
            parts.Add(expression.Substring(numberIndex, index - numberIndex));
        }
        else
            parts.Add(c.ToString());
    }

    // move unary signs into following number
    index = 0;
    while (index < parts.Count - 1)
    {
        bool isSign = parts[index] == "-" || parts[index] == "+";
        bool isFirstOrFollowingOperator = index == 0 || isOperator(parts[index - 1][0]);
        bool isPriorToNumber = isNumber(parts[index + 1][0]);
        
        if (isSign && isFirstOrFollowingOperator && isPriorToNumber)
        {
            parts[index + 1] = parts[index] + parts[index + 1];
            parts.RemoveAt(index);
        }
        else
            index++;
    }
    return parts;
}

示例输入:"-1+-2*-10.1*.1",输出:

-1 
+ 
-2 
* 
-10.1 
* 
.1 

【讨论】:

    猜你喜欢
    • 2019-10-19
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-18
    相关资源
    最近更新 更多