拆分字符串模式

时间:2013-11-08 16:26:40

标签: c# asp.net regex vb.net string

我有一个字符串,我需要拆分成一个字符串数组。所有值都由管道|分隔,并用逗号分隔。

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

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

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

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

6 个答案:

答案 0 :(得分:2)

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

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

这将匹配零个或多个非管道字符[^|]*,这些字符位于(?<=\|)之后,后跟管道(?=\|)

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

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

答案 1 :(得分: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;
}

答案 2 :(得分: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''
""
""
""
""

答案 3 :(得分:0)

mmm也许这适合你:

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('¬');

的问候。,

ķ

答案 4 :(得分: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();

答案 5 :(得分: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);
}

虽然,在...之间找到任何东西和|,您可能并且可能应该使用[^ \ |]而不是。字符。

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