如何保留Regex.Split的分隔符?

39

我想使用Regex 类中的 Split 函数来拆分字符串。问题是它 移除 了分隔符,而我想保留它们,最好作为 splitee 中单独的元素。

根据我找到的其他讨论,目前只有不方便的方法可以实现这一点。

有任何建议吗?


6
输入字符串?您的正则表达式?期望输出? - I4V
5
相反,确实有可供发布的示例代码。您写道,“问题在于它会移除...” 在这种情况下,“它”是什么?这是一个经典的问题:“我可以得到这个输出,但我想要得到这个输出”,这是一个非常好的问题,但如果展示原始代码(提供接近但不完全符合期望输出的代码)将使回答变得更加容易。 - David Robinson
2
这个问题引发了一场Meta上的讨论 - Michael Petrotta
3
@AndreasJohansson - 不要重新发布。[编辑]如果您的帖子有问题,重新发布可能会导致自动禁言。相反,我认为这里的人们只是简单地要求您发布一个代码示例,以便他们可以根据您已经知道的内容为您量身定制解决方案,而不是猜测您已经掌握的内容,然后让您回来发表评论说“不,那不是我想要的。”请记住,这里的人们是自愿帮助您的,因此通过发布他们所要求的内容来帮助他们是明智的。希望这可以帮到你! :) - jamesmortensen
1
@jmort253,我真的尝试重新表达这个问题,但是我无法找到任何不损害我提出的问题的方式。非常抱歉。因为这个问题引起了太多的注意,我将会完全忽略它。请不要认为我正在忽视你。我只是切断了受感染的线程。 - user1675891
显示剩余2条评论
6个回答

95
只需将该模式放入捕获组中,匹配结果也将包含在结果中。
string[] result = Regex.Split("123.456.789", @"(\.)");

结果:

{ "123", ".", "456", ".", "789" }

这也适用于许多其他语言:

  • JavaScript"123.456.789".split(/(\.)/g)
  • Pythonre.split(r"(\.)", "123.456.789")
  • Perlsplit(/(\.)/g, "123.456.789")

(不适用于Java)


哦,这个更好!有趣的例子 - 你用一个实际上是句点的句点来匹配任何。对于这种优秀的语法,加1分!然而,由于某些原因它没有捕获最后一个元素,所以我只得到了你说的内容,但除了789部分。 - user1675891
在阅读“向前查看”的过程中,我了解到它不像结果一样包含在其中,例如:Regex.Match ("say 25 miles more", @"\d+\s(?=miles)"); //输出:25另一个语句说明,在拆分时包含分隔符,需将模式放在正向先行断言中,如:Regex.Split ("oneTwoThree", @"(?=[A-Z])"); // 输出 one Two Three感到困惑。 - user2156081
1
@sortednoun 前瞻匹配零个字符,仅当正文从该位置匹配时。前瞻正文不是匹配的一部分,因此没有额外的内容需要包含。正文匹配的文本将被包含在下一个数组项中进行拆分。(?=([A-Z])) 将同时创建一个带有字母的额外项并将其包含在下一个项中。 - Markus Jarderot

7
使用Matches查找字符串中的分隔符,然后获取值和分隔符。
例如:
string input = "asdf,asdf;asdf.asdf,asdf,asdf";

var values = new List<string>();
int pos = 0;
foreach (Match m in Regex.Matches(input, "[,.;]")) {
  values.Add(input.Substring(pos, m.Index - pos));
  values.Add(m.Value);
  pos = m.Index + m.Length;
}
values.Add(input.Substring(pos));

4
假设输入为 "abc1defg2hi3jkl",需要使用正则表达式来提取数字。
String input = "abc1defg2hi3jkl";
var parts = Regex.Matches(input, @"\d+|\D+")
            .Cast<Match>()
            .Select(m => m.Value)
            .ToList();

需要翻译的内容为: 部件将是:abc 1 defg 2 hi 3 jkl


1

0

针对C#: 将段落按保留分隔符拆分为句子 句子由.或?或!后跟一个空格拆分(否则,如果句子中有任何电子邮件ID,则会被拆分)

string data="first. second! third? ";
Regex delimiter = new Regex("(?<=[.?!] )"); //there is a space between ] and )
string[] afterRegex=delimiter.Split(data);

结果

first. second! third?


0
将它们添加回去:
    string[] Parts = "A,B,C,D,E".Split(',');
    string[] Parts2 = new string[Parts.Length * 2 - 1];
    for (int i = 0; i < Parts.Length; i++)
    {
        Parts2[i * 2] = Parts[i];
        if (i < Parts.Length - 1)
            Parts2[i * 2 + 1] = ",";
    }

1
但是,如果正则表达式有多个可能的匹配项,则该方法无法正常工作。 - AJMansfield
1
如果您不知道使用了什么分隔符,该怎么办?您能向我们重复一下 Regex 类的示例吗? - user1675891

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