Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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#_Arrays_String_Delimiter - Fatal编程技术网

如何在c#中生成分隔符并获取值

如何在c#中生成分隔符并获取值,c#,arrays,string,delimiter,C#,Arrays,String,Delimiter,C#Visual Studio 17 假设我有一个值为[3-4+6*2]甚至[3-4+20-0.5]的字符串 ... 我希望它们存储在一个字符串数组中。。。我研究发现,使用分割、修剪开始、修剪结束,我们可以将它们分开 .TrimStart('[') .TrimEnd(']') .Split('-','*','+'); 但我无法确定我们是否能做到这一点,我的意思是 但是我也找不到任何地方如何存储分隔符,而是让它们完成它们的工作(我的意思是分离) 存储的值将是{3,4,6,2},但我想要这个{3,

C#Visual Studio 17

假设我有一个值为[3-4+6*2]甚至[3-4+20-0.5]的字符串 ... 我希望它们存储在一个字符串数组中。。。我研究发现,使用分割、修剪开始、修剪结束,我们可以将它们分开

.TrimStart('[')
.TrimEnd(']')
.Split('-','*','+');
但我无法确定我们是否能做到这一点,我的意思是

但是我也找不到任何地方如何存储分隔符,而是让它们完成它们的工作(我的意思是分离)

存储的值将是{3,4,6,2},但我想要这个{3,-,4,+,6,*,2} 我该怎么处理这些不寻常的零

在一般情况下,您必须使用解析器;如果只想拆分并保留分隔符,请查看
Regex.split

  string source = "[-3*4+20-0.5/-4.1]";

  //TODO: specify the delimiters:
  // If you want more delimiters, e.g. (, ), [, ] etc. 
  // for, say, 9*[(456+789)/(95-2.96)-3]
  // just add them into the array
  char[] delimiters = new char[]  { '*', '+', '-', '/' };

  string pattern = "(" + string.Join("|", delimiters
    .Select(item => Regex.Escape(item.ToString()))) + ")";

  string[] result = Regex
    .Split(source.TrimStart('[').TrimEnd(']'), pattern) // (...) preserves delim
    .Select(item => item.Trim()) // <- if you want to trim each item 
    .Where(item => !string.IsNullOrEmpty(item))
    .ToArray();

  // -, 3, *, 4, +, 20, -, 0.5, /, -, 4.1
  Console.Write(string.Join(", ", result));
string source=“[-3*4+20-0.5/-4.1]”;
//TODO:指定分隔符:
//如果需要更多分隔符,例如,(,),[,]等。
//例如,9*[(456+789)/(95-2.96)-3]
//只需将它们添加到数组中
字符[]分隔符=新字符[]{'*','+','-','/'};
string pattern=“(“+string.Join”(|)”,分隔符
.Select(item=>Regex.Escape(item.ToString())+”);
字符串[]结果=Regex
.Split(source.TrimStart('[')).TrimEnd(']')、pattern)/(…)保留delim
.Select(item=>item.Trim())/!string.IsNullOrEmpty(项目))
.ToArray();
// -, 3, *, 4, +, 20, -, 0.5, /, -, 4.1
Write(string.Join(“,”,result));
编辑:对于大文本,您可能需要手动执行拆分:

public static List<string> SplitPreserveSeparators(string source, char[] delimiters) {
  if (null == source)
    throw new ArgumentNullException("source") 
  else if (delimiters == null)
    throw new ArgumentNullException("delimiters") 

  int start = 0;
  int index = -1;

  List<string> items = new List<string>();

  while ((index = source.IndexOfAny(delimiters, start)) >= 0) {
    string value = source.Substring(start, index - start);

    if (!string.IsNullOrEmpty(value))
      items.Add(value);

    items.Add(source.Substring(index, 1));
    start = index + 1;
  }

  if (start < source.Length)
    items.Add(source.Substring(start));

  return items;
}
公共静态列表分隔符(字符串源,字符[]分隔符){
if(null==源)
抛出新ArgumentNullException(“源”)
else if(分隔符==null)
抛出新的ArgumentNullException(“分隔符”)
int start=0;
int指数=-1;
列表项=新列表();
而((index=source.IndexOfAny(分隔符,开始))>=0){
字符串值=source.Substring(start,index-start);
如果(!string.IsNullOrEmpty(值))
增加(价值);
添加(源.子字符串(索引,1));
开始=索引+1;
}
如果(开始<源长度)
items.Add(source.Substring(start));
退货项目;
}
并使用它

string source = "[-3-4+20-0.5/-4.1]";
char[] delimiters = new char[]  { '*', '+', '-', '/' };

List<string> result =  SplitPreserveSeparators(
  source.TrimStart('[').TrimEnd(']'),
  delimiters);

Console.Write(string.Join(", ", result));
stringsource=“[-3-4+20-0.5/-4.1]”;
字符[]分隔符=新字符[]{'*','+','-','/'};
列表结果=分隔符(
source.TrimStart('[')。TrimEnd(']'),
分隔符);
Write(string.Join(“,”,result));

您可以实现一种简单的自定义扩展方法,用于使用存储的分隔符进行拆分:

public static class StringExtensions
{
    public static string[] SplitStoreSeparators(this string input, char[] separators) 
    {
        List<string> tokens = new List<string>();

        StringBuilder sb = new StringBuilder(); 
        foreach (var c in input)
        {
            if (separators.Contains(c)) {
                if (sb.Length > 0) {
                    tokens.Add(sb.ToString());
                    sb.Clear();
                }
                tokens.Add(c.ToString());
            } else {
                sb.Append(c);
            }
        }

        if (sb.Length > 0)
            tokens.Add(sb.ToString());

        return tokens.ToArray();
    }
}

也许,枚举此字符串并将每个元素存储在结果数组中,跳过第一个和最后一个元素将得到所需的结果。

字符串是一个字符数组。因此,您可以使用
String.tocharray()
方法将其存储为数组。 要删除第一个和最后一个字符,我们可以为起始索引传入一个
int
,为所需长度传入一个
int

例如:

string myString = "[3-4+6*2]";

char[] myArray = myString.ToCharArray(1, myString.Length-2);

这将删除字符串的第一个和最后一个字符,并将剩余的每个字符存储在一个数组中。

@Lanorkin:Nice catch!非常感谢。空字符串应该被删除(我已经编辑了asnwer)。在一般情况下,除了语法分析器之外别无选择。这个问题的例子很糟糕,只描述了一个非常简单的例子。我们需要一个非常复杂甚至是最糟糕的场景来提供一个有效的答案。当前的问题可以通过从内部字符串中提取字符数组来解决。@Rufo爵士:完全正确,我已经编辑了测试输入(从问题-
/-4.1
添加的术语中加重了一个);但是,不支持指数格式-
“1e-2”
将被拆分为
1e,-,2
@Lanorkin我对这个问题太短视了。我已经更新了我的答案。
string current=“”。。。电流+=c
对于
字符串
来说不是一个好角色(尤其是当您要解析一个大文本时)<代码>StringBuilder当前=。。。当前。追加(c)@DmitryBychenko你完全正确。我已经更新了我的答案。问题不是如何存储分隔符。问题是如何在数组中存储分隔符和字符。如果你已经删除了你的评论,也请考虑取消你的投票,但是这不会在分界表上分裂。那么“[10+12]”呢?请用最坏的情况和预期结果更新您的问题。可能[-0.5*1000.5+5000-(7+5)]=>???
string myString = "[3-4+6*2]";

char[] myArray = myString.ToCharArray(1, myString.Length-2);