如何在c#中创建分隔符并获取值

时间:2017-03-27 06:34:47

标签: 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, - ,4,+,6,*,2} 如何处理非凡的零点??

4 个答案:

答案 0 :(得分:1)

一般的情况下,您必须使用解析器;如果只想分割并保留分隔符,请查看d_t

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

并使用它

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

答案 1 :(得分:0)

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

/* Jenkins Pipeline in Groovy */

def clientlist = ['AAA', 'BBB', 'CCC']


/*
    Stage #1
*/

stage concurrency: 3, name: '1. Deploying Prep Database'
    echo 'Deploying Prep Database DacPac'

    for(item in clientlist)         
    {             
        build job: 'Deploy_PrepDB_SHELL', parameters: [[$class: 'StringParameterValue', name: 'CLIENT_NAME', value: item]], wait: false       
        Thread.sleep(1000)           
    }


/*
    Stage #2
    Should not start until all 3 builds from previous stage have successfully finished!
*/

stage concurrency: 3, name: '2. Deploying Target Database'
    echo 'Deploying Target Database DacPac'            

    for(item in clientlist)      
    {         
        build job: 'Deploy_TargetDB_SHELL', parameters: [[$class: 'StringParameterValue', name: 'CLIENT_NAME', value: item]], wait: false       
        Thread.sleep(1000)      
    }

用法:

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

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

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

例如:

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

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

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