C#Visual Studio 17
假设我有一个字符串,其值为[3-4 + 6 * 2]或甚至[3-4 + 20-0.5] ......我希望它们存储在一个字符串数组中...我已经研究过并发现使用拆分,修剪开始,修剪结束我们可以将它们分开......
.TrimStart('[')
.TrimEnd(']')
.Split('-','*','+');
但我无法确定我们是否可以这样做,我的意思是
但我找不到任何地方如何存放分隔符,但让他们做他们的工作(我的意思是分开)!!
存储的值将是{3,4,6,2},但我想要{3, - ,4,+,6,*,2} 如何处理非凡的零点??
答案 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);
这将删除字符串的第一个和最后一个字符,并将每个剩余字符存储在数组中。