【问题标题】:Extract subgroups of string提取字符串的子组
【发布时间】:2015-03-07 16:17:52
【问题描述】:

给定一个字符串 x,例如:

 var str = "This is the paragraph1. This is the paragraph2. This paragraph has not period";

我只想提取以句点 (.) 结尾的段落

这是我的代码:

 var paragraphs = str.Split(new[] {'.'}, StringSplitOptions.RemoveEmptyEntries);

为什么结果是 3 项而不是 2 项?

str 可以是可变的

在这种情况下:

var str = "This is the paragraph1. This is the paragraph2. This paragraph3.";

结果应该是 3 项

【问题讨论】:

  • 我认为正确的语法应该是new[] {'.'}。我们到底在谈论哪个结果?是paragraphs.Length吗?
  • 你的预期输出是什么?
  • 对不起,结果是数组中有 3 或 2 项
  • 您必须使用paragraphs.Length-1 来获取计数。
  • 为什么要添加 [regex] 标签?您的代码不使用正则表达式,而且似乎不需要正则表达式。您是否正在专门寻找确实使用正则表达式的解决方案?

标签: c# regex split


【解决方案1】:

为什么结果是 3 项而不是 2 项?

string.Split() 就是这样工作的。它在找到您提供的给定拆分文本的每个点拆分字符串。你的字符串中有两个这样的点——即两个句点——所以字符串被分成两个地方。

当你把东西分成两部分时,你会得到三个部分。所以三个部分归还给你。

如果您只想要以句点结束的文本,则需要使用不同的算法。一种可能性是简单地使用StringSplitOptions.RemoveEmptyEntries 选项,并忽略返回数组中的最后一项。

【讨论】:

    【解决方案2】:

    似乎您只想提取第 1 段和第 2 段。

    @"(?<=\.|^)[^.]*\."
    

    代码:

    String input = @"This is the paragraph1. This is the paragraph2. This paragraph has not period";
    Regex rgx = new Regex(@"(?<=\.|^)[^.]*\.");
    foreach (Match m in rgx.Matches(input))
    Console.WriteLine(m.Groups[0].Value);
    

    IDEONE

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 2016-04-04
      • 2014-02-13
      • 2021-09-08
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      相关资源
      最近更新 更多