我有一个字符串,我需要拆分成一个字符串数组。所有值都由管道|
分隔,并用逗号分隔。
|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,但我不知道如何编写正确的正则表达式。任何建议或任何更好的方法来实现这一点将非常感激。
答案 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);
}
虽然,在...之间找到任何东西和|,您可能并且可能应该使用[^ \ |]而不是。字符。
至少,对于指定的用例,它会给出您期望的结果。