如何在c#中生成分隔符并获取值
C#Visual Studio 17 假设我有一个值为[3-4+6*2]甚至[3-4+20-0.5]的字符串 ... 我希望它们存储在一个字符串数组中。。。我研究发现,使用分割、修剪开始、修剪结束,我们可以将它们分开如何在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,
.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);