拆分带有加号的字符串作为分隔符

时间:2018-03-29 12:29:59

标签: c# string parsing split

我遇到包含加号(+)的字符串的问题。 我想分割那个字符串(或者如果有其他方法来解决我的问题)

string ColumnPlusLevel = "+-J10+-J10+-J10+-J10+-J10";
string strpluslevel = ""; 
strpluslevel = ColumnPlusLevel; 
string[] strpluslevel_lines = Regex.Split(strpluslevel, "+");

foreach (string line in strpluslevel_lines)
{
    MessageBox.Show(line);
    strpluslevel_summa = strpluslevel_summa + line;
}   

MessageBox.Show(strpluslevel_summa, "summa sumarum");

MessageBox用于我的测试目的。

现在...... ColumnPlusLevel字符串可以有非常多样的条目,但它始终是以加号开头的重复模式。 例如,“+ MJ + MJ + MJ”或“+ PPL14.1 + PPL14.1 + PPL14.1”。 (它来自另一个软件,我无法编辑该软件的输出)

如何找出重复的模式? 在这个例子中,这是+ -J10或+ MJ或+ PPL14.1

在上面的例子中,我通过仅使用MessageBox来测试它,但我希望稍后将重复的模式存储在字符串中。

也许我使用Split做错了,也许有另一个解决方案。 也许我以错误的方式使用Split。

希望您了解我的问题和我想要的结果。

感谢您的任何建议。

/托马斯

4 个答案:

答案 0 :(得分:5)

  

如何找出正在重复的模式?

也许我完全不理解这个要求,但是并不容易:

string[] tokens = ColumnPlusLevel.Split(new[]{'+'}, StringSplitOptions.RemoveEmptyEntries);
string first = tokens[0];
bool repeatingPattern = tokens.Skip(1).All(s => s == first);

如果repeatingPatterntrue,您就知道该模式本身为first

  

你能否解释逻辑是如何运作的?

包含tokens.Skip(1)的行是LINQ查询,因此您需要在代码文件的顶部添加using System.Linq。由于tokens是实现string[]的{​​{1}},因此您可以使用任何LINQ(扩展名)方法。 IEnumerable<string>跳过第一个,因为我已将其存储在变量中,并且我想知道所有其他是否相同。因此,我使用Enumerable.Skip(1)只要一个项目与条件不匹配就返回All(因此一个字符串与第一个字符串不同)。如果全部相同,则您知道存在重复模式,该模式已存储在变量false中。

答案 1 :(得分:1)

您应该使用String.Split功能:

$ awk -v seed=$RANDOM '                   # get some randomness from shell
function cmp_randomize(i1, v1, i2, v2) {  # random for traversal function
    return (2 - 4 * rand())               # from 12.2.1 Controlling Array Traversal
}                                         # of Gnu awk docs
BEGIN {
    srand(seed)                           # use the seed, Luke
    PROCINFO["sorted_in"]="cmp_randomize" # use above defined function
}
/^[^>]/ {                                 # if starts with anything but >
    split($0,a,"")                        # split to hash a
    for(i in a)                           # iterate a in random order
        printf "%s", a[i]                 # output
    print ""                              # newline
    next                                  # next record
}1' file                                  # output > starting records
>line1
CAB
>line2
DFE
>line3
GIH
>line4
LKJ

答案 2 :(得分:0)

  

...但它始终是以加号开头的重复模式。

如果模式总是只重复自己,为什么你甚至需要String.Split()?

string input = @"+MJ+MJ+MJ";

int indexOfSecondPlus = input.IndexOf('+', 1);
string pattern = input.Remove(indexOfSecondPlus, input.Length - indexOfSecondPlus);
//pattern is now "+MJ"

无需字符串拆分,无需使用LinQ

答案 3 :(得分:0)

String有一个名为Split的方法,可让您根据给定的字符/字符集拆分/分割字符串:

string givenString = "+-J10+-J10+-J10+-J10+-J10"'

string SplittedString = givenString.Split("+")[0] ///Here + is the character based on which the string would be splitted and 0 is the index number

string result = SplittedString.Replace("-","") //The mothod REPLACE replaces the given string with a targeted string,i added this so that you can get the numbers only from the string