1

我有一个字符串,我需要将其拆分为一个字符串数组。所有值都由竖线分隔|并用逗号分隔。

|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||

拆分后数组应具有以下8个值

111
2,2
room 1
13'2'' x 13'8''
""
""
""
""

“”我只是指一个空字符串。请注意,该值也可以有逗号,例如 2,2。我认为最好的方法可能是通过 Regex.Split 但我不确定如何编写正确的正则表达式。任何建议或任何更好的方法来实现这一点将不胜感激。

4

6 回答 6

2

只要管道字符之间的值不包含管道字符本身,您就可以使用它Match()来获取值:split()

(?<=\|)[^|]*(?=\|)

这将匹配零个或多个非管道字符[^|]*,这些字符前面(?<=\|)和后面都有一个 pipe (?=\|)

在 C# 中:

var input = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var results = Regex.Matches(input, @"(?<=\|)[^|]*(?=\|)"); 
foreach (Match match in results)
     Console.WriteLine("Found '{0}' at position {1}", 
                       match.Value, match.Index);

编辑:由于逗号总是分隔管道字符之间的值,因此|我们可以确定用作分隔符的逗号总是以奇数间隔出现,因此我们只能遍历数组的偶数索引以获得真正的值,如下所示:

var input = "|room 1|,|,|,||,||,||,||,||,||";

var results = Regex.Matches(input, @"(?<=\|)[^|]*(?=\|)");

for (int i = 0; i < results.Count; i+=2)
    Console.WriteLine("Found '{0}'", results[i].Value);

这也可以用在上面的第一个例子中。

于 2013-11-08T16:29:29.053 回答
1

无需使用正则表达式,删除管道并在逗号上拆分字符串:

var input = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";

var parts = input.Split(',').Select(x => x.Replace("|", string.Empty));

或者

var parts = input.Replace("|", string.Empty).Split(',');


编辑:好的,在这种情况下,使用 while 循环来解析字符串:

var values = new List<string>();
var str = @"|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";;
while (str.Length > 0)
{
    var open = str.IndexOf('|');
    var close = str.IndexOf('|', open + 1);

    var value = str.Substring(open + 1, open + close - 1);
    values.Add(value);

    str = open + close < str.Length - 1 
            ? str.Substring(open + close + 2) 
            : string.Empty;
}
于 2013-11-08T16:29:32.560 回答
1

假设所有字段都用竖线括起来并用逗号分隔,您可以使用 |,| 作为分隔符,删除前导和尾随 |

Dim data = "|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||"
Dim delim = New String() {"|,|"}
Dim results = data.Substring(1, data.Length - 2).Split(delim, StringSplitOptions.None)

For Each s In results
  Console.WriteLine(s)
Next

输出:

111
2,2
room 1
13'2'' x 13'8''
""
""
""
""
于 2013-11-08T17:03:09.777 回答
0

检查,如果这符合您的需求...

var str = "|111|,|2,2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";  
//Iterate through all your matches (we're looking for anything between | and |, non-greedy)                     
foreach (Match m in Regex.Matches(str, @"\|(.*?)\|"))
{
    //Groups[0] is entire match, with || symbols, but [1] - something between ()
    Console.WriteLine(m.Groups[1].Value);
}

不过,要在 | 之间找到任何东西 和 |,您可能也应该使用 [^\|] 而不是 . 特点。

至少,对于指定的用例,它给出了您期望的结果。

于 2013-11-08T17:09:17.703 回答
0

嗯,也许这对你有用:

var data = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var resultArray = data.Replace("|", "").Split(',');

问候。,

ķ

编辑:您可以使用通配符

string data = "|111|,|2,2|,|,3|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";
var resultArray = data.Replace("|,|", "¬").Replace("|", "").Split('¬');

问候。,

ķ

于 2013-11-08T16:33:59.897 回答
0

你可以试试这个:

 string a = "|111|,|2|,|room 1|,|13'2'' x 13'8''|,||,||,||,||";

 string[] result = a.Split('|').Where(s => !s.Contains(",")).Select(s => s.Replace("|",String.Empty)).ToArray();
于 2013-11-08T16:34:04.693 回答