2017-04-25 78 views
14

我想分割以下一种字符串:斯普利特 '/' 直到 '[' 出现

父/子/值[4za] AX/BY

并获得创建String[]出它通过:

String[] ArrayVar = Regex.Split(stringVar, "?"); 

其中[第一出现之前通过分割每/的字符串。

因此,作为结果,我会得到

Array[0] => "Parent" 
Array[1] => "Child" 
Array[2] => "Value [4za] AX/BY" 

串还可能​​有其他格式,如

父/值[4za] AX/BY

值[4za] AX/BY

我该怎么做?

回答

24

使用负向后视((?<!...))。下面的正则表达式的意思是 “/不打开支架之前”:

(?<!\[.*)/ 

Demo

C#演示:https://dotnetfiddle.net/85S3cK

+1

FYI:如果字符串包含换行符,它可能是有用的选项,通过一个单线(“DOTALL”)的正则表达式引擎,'@ “(?s)(?<!\ [。*)/”'或'Regex.Split(stringVar,@“(?<!\ [。*)/”,RegexOptions.Singleline);'。 –

+0

如果引擎不支持任意长度的lookbehinds? –

+0

@QPaysTaxes,没有任意长度的lookbehinds,单个正则表达式语句要么是不可能的,要么是太复杂,不值得花费在像TheLethalCoder的答案这样的解决方案上。 – asgallant

33

你可以使用普通的字符串操作来做到这一点。只需将字符串拆分为第一个[,然后相应地拆分。然后,只需添加字符串的结尾部分到最后一个元素:

string inputstring = "Parent/Child/Value [4za] AX/BY"; 

int index = inputstring.IndexOf('['); 

string[] parts = inputstring.Substring(0, index).Split('/'); 
parts[parts.Length - 1] += inputstring.Substring(index); 
+1

如果没有编译'Regex',那么这个方法实际上可能会更快。 – Pharap

+3

即使编译正则表达式,这可能会更快。 – Mardoxx

+0

这很好,但单线并不差,并且足够可读。 –