2015-12-24 117 views
4
string s= abc**xy**efg**xy**ijk123**xy**lmxno**xy**opq**xy**rstz; 

我想输出为字符串数组,它在“xy”处分割。我用分割字符串和字符串数组

string[] lines = Regex.Split(s, "xy"); 

这里它删除了xy。我想要与xy一起排列。所以,我将我的字符串拆分为字符串数组后,数组应该如下所示。

lines[0]= abc; 
lines[1]= xyefg; 
lines[2]= xyijk123; 
lines[3]= xylmxno; 
lines[4]= xyopq ; 
lines[5]= xyrstz; 

我该怎么做?

+0

你需要什么语言? –

+0

请将您正在使用的语言添加到标签。它是C#吗? –

+0

我正在使用的语言是C# – young

回答

3
(?=xy) 

您需要拆分0 width assertion。查看演示。

https://regex101.com/r/fM9lY3/50

string strRegex = @"(?=xy)"; 
Regex myRegex = new Regex(strRegex, RegexOptions.None); 
string strTargetString = @"abcxyefgxyijk123xylmxnoxyopqxyrstz"; 

return myRegex.Split(strTargetString); 

输出:

abc xyefg xyijk123 xylmxno xyopq xyrstz

+0

谢谢。有效。 – young

0

如何简单地循环thorkh数组从索引1开始,并将“xy”字符串添加到每个条目?

或者实现您自己的分割版本,将字符串切割成您想要的版本。

也是另一种解决方案将以非贪婪的方式匹配“xy *”,并且您的数组将成为所有匹配的列表。根据不同的语言,这可能不会被称为拆分BTW。

+1

如果没有实际解决方案,请不要提供建议。就目前而言,你的答案更像是一个重要的评论。 – Enigmativity

+0

有时候,正确方向的提示比解决方案本身更值钱。顺便说一下,迄今为止给出的所有其他三个答案都显示了我的三个建议的实现;-) –

+1

如果这是一个问题和提示网站,我会同意,但这是一个问题和答案网站。你应该坚持完整的答案。 Stack Overflow的首要目的不是为发布问题的人提供答案,而是一遍又一遍地向未来浏览此问题的人提供答案。这只是一个很好的问题和良好的答案才能达到这个目的。 – Enigmativity

2

如果你还没有结婚的正则表达式,你可以把你自己的扩展方法:

public static IEnumerable<string> Ssplit(this string InputString, string Delimiter) 
{ 
    int idx = InputString.IndexOf(Delimiter); 
    while (idx != -1) 
    { 
     yield return InputString.Substring(0, idx); 
     InputString = InputString.Substring(idx); 

     idx = InputString.IndexOf(Delimiter, Delimiter.Length); 
    } 

    yield return InputString; 
} 

用法:

string s = "abc**xy**efg**xy**ijk123**xy**lmxno**xy**opq**xy**rstz"; 
var x = s.Ssplit("xy"); 
+0

我非常喜欢你这样做的方式,但是我认为如果你使用'yield return'而不是'List output',这将是一个非常棒的答案。 – Enigmativity

+1

@Enigmativity - 感谢您的洞察力和建议。我不是在C#中进行“经典培训”,并且可能因暴力解决方案而犯罪。我已经对“yield return”做了一些阅读,并根据您的反馈修改了我的建议 - 并将其添加到了我的工具箱中。再次感谢。 – Hambone

2

这似乎很简单做到这一点:

string s = "abc**xy**efg**xy**ijk123**xy**lmxno**xy**opq**xy**rstz"; 

string[] lines = Regex.Split(s, "xy"); 

lines = lines.Take(1).Concat(lines.Skip(1).Select(l => "xy" + l)).ToArray(); 

我得到以下结果:

lines

我不知道,如果你想保持** - 你问题没有说清楚。将RegEx更改为@"\*\*xy\*\*"将删除**

+0

谢谢!工作。 – young