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

Posted

技术标签:

【中文标题】如何保留 Regex.Split 的分隔符?【英文标题】:How to keep the delimiters of Regex.Split? 【发布时间】:2013-03-18 01:40:36 【问题描述】:

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

根据我发现的other discussions,只有不方便的方法可以实现。

有什么建议吗?

【问题讨论】:

输入字符串?你的正则表达式?预期输出? @AndreasJohansson:相反,有 示例代码要发布。你写了the problem is that it removes... 在这种情况下“它”是什么?这是一个经典问题“我可以得到这个输出,但我想得到这个输出” - 一个很好的问题,但是如果原始代码(给出接近但不完全, 所需的输出) 被显示出来。 这个问题触发了discussion on Meta。 @AndreasJohansson - 不要转发。 edit。如果您的帖子有问题,重新发布它可能会导致自动禁止提问。相反,我认为这里的人们只是要求您发布一个不起作用的代码示例,以便它可以帮助他们为您定制一个基于您已经知道的解决方案,而不是猜测您所知道的和那么你有没有回来评论说“不,这不是我的意思。”。请记住,这里的人们自愿花时间帮助您,因此通过发布他们的要求来帮助他们是明智的。希望这可以帮助! :) @jmort253 我真的试图重新表述这个问题,但我可以找到任何方法来做到这一点,而不会真正破坏 I 提出的问题。我真的很抱歉。我将完全忽略这个问题,因为它引起了很多关注。请不要这样认为,因为我忽略了。我只是切断了被感染的线程。 【参考方案1】:

只需将模式放入捕获组,匹配项也会包含在结果中。

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)

【讨论】:

哦,这更好!有趣的例子 - 你匹配 any 一个句点 actually 是一个句点。 +1 语法很棒!但是,由于某种原因,它没有捕捉到最后一个元素,所以我得到了你所说的,但 except 对于 789 部分。 在阅读前瞻时,我读到它不包含在结果中,例如:Regex.Match ("say 25 miles more", @"\d+\s(?=miles)"); //OUTPUT: 25 和另一条语句声明在拆分时包含分隔符,将模式以正向向前看:Regex.Split ("oneTwoThree", @"(?=[A-Z])"); // 输出一二三混淆 @sortednoun 前瞻匹配零个字符,前提是正文将从该位置匹配。前瞻主体不是匹配的一部分,因此没有任何额外内容可包含。拆分时,正文匹配的文本将包含在下一个数组项中。 (?=([A-Z])) 将创建一个带有该字母的额外项目并将其包含在下一个项目中。【参考方案2】:

使用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));

【讨论】:

【参考方案3】:

说输入是“abc1defg2hi3jkl”,正则表达式是用来挑数字的。

String input = "abc1defg2hi3jkl";
var parts = Regex.Matches(input, @"\d+|\D+")
            .Cast<Match>()
            .Select(m => m.Value)
            .ToList();

零件将是:abc1defg2hi3jkl

【讨论】:

【参考方案4】:

对于 Java:

Arrays.stream("123.456.789".split("(?<=\\.)|(?=\\.)+"))
                .forEach((p) -> 
                    System.out.println(p);
                );

输出:

123
.
456
.
789

灵感来自这篇文章 (How to split string but keep delimiters in java?)

【讨论】:

【参考方案5】:

把它们加回来:

    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] = ",";
    

【讨论】:

但这在正则表达式有多个可能匹配的情况下不起作用。 如果不知道使用了什么分隔符怎么办?你能把这个例子重复给我们 Regex 类吗?

以上是关于如何保留 Regex.Split 的分隔符?的主要内容,如果未能解决你的问题,请参考以下文章

如何将分隔符数组传递给 Regex.Split 函数? [关闭]

正则表达式(preg_split):如何根据分隔符进行拆分,不包括一对引号中包含的分隔符?

Java string.split 与 C# Regex.split - 限制为一定数量的字段

regex 正则分割字符串

使用正则表达式分隔单个单词?

提取字符串中字符串分隔符之间的所有子字符串(C#)