分割字符串和字符串数组

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;

我该怎么做?


你需要用什么语言翻译? - Hubert Grzeskowiak
请在标签中添加您正在使用的编程语言。这是C#吗? - Zhaoxing Lu
我正在使用的编程语言是C#。 - young
1
如果你的代码是有效的C#,那就太好了。否则我们需要花时间修复代码才能提供一个可行的答案。 - Enigmativity
4个回答

3
(?=xy)

你需要基于0宽度断言进行分割。请参考演示。 https://regex101.com/r/fM9lY3/50
string strRegex = @"(?=xy)";
Regex myRegex = new Regex(strRegex, RegexOptions.None);
string strTargetString = @"abcxyefgxyijk123xylmxnoxyopqxyrstz";

return myRegex.Split(strTargetString);

Output:

abc xyefg xyijk123 xylmxno xyopq xyrstz


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

我非常喜欢你的想法,但是如果你使用yield return而不是List<string> 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

我不知道你是否想保留**,因为你的问题没有明确说明。将正则表达式更改为@"\*\*xy\*\*"将删除**

0
如何简单地循环遍历数组,从索引1开始并将“xy”字符串添加到每个条目?
或者实现自己的split版本,以您想要的方式切割字符串。
另一种解决方案是以非贪婪方式匹配“xy*”,并且您的数组将是所有匹配项的列表。根据语言,这可能不会被称为split。

1
请不要在没有实际解决方案的情况下提出建议。就目前而言,您的答案更像是一条长评论。 - Enigmativity
有时候,正确方向的提示比解决方案本身更有价值。顺便说一下,到目前为止给出的其他三个答案都展示了我提出的三个建议的实现方式;-) - Hubert Grzeskowiak
1
如果这是一个问题和提示网站,我会同意,但这是一个问题和答案网站。你应该坚持提供完整的答案。Stack Overflow 的总体目的不仅仅是为了回答发帖者的问题,而是为了将答案一遍又一遍地提供给未来浏览此问题的人们。只有通过好的问题和好的答案才能实现这个目的。 - Enigmativity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接