如何保留 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)
Python:re.split(r"(\.)", "123.456.789")
Perl:split(/(\.)/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();
零件将是:abc
1
defg
2
hi
3
jkl
【讨论】:
【参考方案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):如何根据分隔符进行拆分,不包括一对引号中包含的分隔符?