【问题标题】:How to split this string and identify first sentence after last '*'?如何拆分此字符串并识别最后一个'*'之后的第一句话?
【发布时间】:2010-06-18 14:49:43
【问题描述】:

我从数据库中得到一个类似于以下内容的字符串:

下面的目标是做: * blah 1 * blah 2 * blah 3 * blah 4. 有些更无趣 文本。紧接着又是一句话 充满了极其无趣的文字。 幸好这是最后一句话。

我需要对此进行格式化,以便每个 * 代表一个项目符号,最后一个 * 之后的句子换行,理想情况如下:

下面的目标是做: * 废话 1 * 废话 2 * 废话 3 * 废话 4。 一些更无趣的 文本。紧接着又是一句话 充满了极其无趣的文字。 幸好这是最后一句话。

* 字符分割字符串并用<br /> * 替换它很容易。我正在使用以下内容:

string description = GetDescription();

description = description.Replace("*", "<br />*"); // it's going onto a web page.

但这给我的结果是:

下面的目标是做: * 废话 1 * 废话 2 * 废话 3 * blah 4. 一些更无趣的文字。紧随其后 又一句充满了极 无趣的文字。幸好这是 最后一句话。

我在识别最后一个“*”之后的第一个句子时有点困难,所以我也可以在那里休息一下。有人可以告诉我怎么做吗?

【问题讨论】:

    标签: c# string


    【解决方案1】:

    您需要一些方法来确定最后一句话中的 other 分隔符。您可以像当前一样将* 全局替换为&lt;br /&gt; *,然后找到* 的最后一个实例并将下一个. 或任何分隔符替换为. &lt;br /&gt;

    更新

    修复了&lt;br /&gt; .. &lt;br /&gt; 的顺序,正如@Shaded 指出的那样。

    【讨论】:

    • 你可能真的想用 '.
      ' 这样句号就不会随着最后一句跳跃。仍然 +1 因为这就是我会做的。
    【解决方案2】:

    如果可以假设 fist sentence after the last '*' 由句点分隔 - 那么您可以执行以下操作:

    1. 通过查找所有* 字符替换输入
    2. 找到最后一个&lt;br&gt;,然后找到它后面的第一个.
    3. 重新组合片段,将* 替换为&lt;br/&gt;*

    这里有一些代码可以帮助您:(它可能并不完美)。我在这里使用string.Split() 而不是string.Replace(),因为我发现它使逻辑更容易理解。诀窍是最后一个 subRegion 由两部分组成(项目符号和项目符号后面的句子)。

    string inputText = "...";
    string[] subRegions = inputText.Split( "*" );
    // split final region into bullet and sentance based on first period...
    string[] lastRegions = subRegions[subRegion.Length-1].Split(new[]{'.'},2);
    // replace the final subregion with the combined parts (bullet/sentence)
    subRegions[subRegions.Length-1] = string.Join(". <br/>",lastRegions);
    // combine all subregions together, replacing `*` with bulletized breaks.
    string finalText = string.Join( "<br/>*", subRegions );
    

    【讨论】:

      【解决方案3】:

      您需要在 blah 4 之后添加另一个 *

      【讨论】:

      • 如果我在 blah 4 之后再添加一个 *,它将被替换为 "
        *",因此在项目符号后面的句子前面会有一个 *
      【解决方案4】:

      如果您可以假设最后一个项目符号以“.”结尾,那么这样的事情可能会起作用:

      string description =
          "The object of the following is to do: * blah 1 * blah 2 * blah 3 * blah 4. Some more extremely uninteresting text. Followed by yet another sentence full of extrememly uninteresting text. Thankfully this is the last sentence.";            
      int idx = description.IndexOf('.', description.LastIndexOf('*'));
      description = description.Insert(idx+1, "<br />");
      description = description.Replace("*", "<br />*");
      

      基本上它会找到第一次出现的 '.'在最后一个 '*.如果您有更多分隔符,您也可以使用它们。

      【讨论】:

        【解决方案5】:

        不是 C# 专家,但我会考虑将“*”上的字符串“拆分”成一个数组以获取所有项目符号,然后拆分数组中的最后一项(最后一个项目符号与句子)或使用正则表达式来抓取句子。

        即伪代码

        List bullets = description.split('*');
        String lastSentence = bullets(bullets.size() + 1).replace('^\*.*?\.', '');
        

        正则表达式的意思是去除*直到第一个句号的任何内容。

        当然,如果您的最后一句话中当然有“*”,这种方法可能不起作用:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 2013-01-02
          • 2017-04-23
          • 1970-01-01
          相关资源
          最近更新 更多