如何将 1 个长段落拆分为 2 个较短的段落? Google 文档

How to split 1 long paragraph to 2 shorter paragraphs? Google Document

我希望段落最多只有 3 个句子。

为此,我的策略是遍历所有段落并找到第 3 句结尾(见注释)。然后,在它后面添加一个“\r”字符。

这是我的代码:

for (var i = 1; i < paragraphs.length; i++) {
  ...
  sentEnds = paragraphs[i].getText().match(/[a-zA-Z0-9_\u0590-\u05fe][.?!](\s|$)|[.?!][.?!](\s|$)/g);
  //this array is used to count sentences in Hebrew/English/digits that end with 1 or more of either ".","?" or "!"
  ...
  if ((sentEnds != null) && (sentEnds.length > 3)) {
    lineBreakAnchor = paragraphs[i].getText().match(/.{10}[.?!](\s)/g);
    paragraphs[i].replaceText(lineBreakAnchor[2],lineBreakAnchor[2] + "\r");
  }
}

这对于第 1 轮工作正常。但是如果我再次 运行 代码 - 插入的“\r”字符后的文本不会被识别为新段落.因此,每次脚本 运行ning.

时都会插入更多的“\r”(新行)

如何使脚本 "understand" 的“\r”表示新的单独段落?

是否还有另一个 character/approach 可以解决问题?

谢谢。

其实句子的检测并不是一件容易的事

  • 一个句子并不总是以点、问号或感叹号结尾。如果句子以引号结尾,则某些国家/地区的标点符号规则会强制您将句末标记放在引号内:

    John asked: "Who's there?"

  • 不是每个点都表示句末,大写字母后面的点通常不会句末,因为它出现在首字母之后。这里J.后句子没有结束:

    The latest Star Wars movie has been directed by J.J. Abrams.

  • 但是,有时句子 会在大写字母后跟一个点结束:

    This project has been sponsored by NASA.

  • 缩写会让事情变得非常困难:

    For more information check the article in Phys. Rev. Letters 66, 2697, 2013.

考虑到这些困难,让我们仍然尝试获得一些适用于 "usual" 情况的表达式。

进行全局匹配和替换。比赛

((?:[^.?!]+[.?!] +){3})

并将其替换为

\r

Demo

这会查找 3 个句子(一个句子是一系列非点、非-?、非-! 字符后跟一个点、一个 ? 或一个 ! 和一些空格)并在它们之后放置一个 \r .

2020-03-04 更新

试试这个:

var regex = new RegExp('((?:[a-zA-Z0-9_\u0590-\u05fe\s]+[.?!]+\s+){3})', 'gi');
for (var i = 1; i < paragraphs.length; i++) {
  paragraphs[i].replaceText(regex, '\r');
}

无需修改您自己的正则表达式即可实现此目的。

试试这种拆分段落的方法:

  • 获取文档的全部内容并创建一个句子数组。
  • 在原始段落后插入最多 3 个句子的段落。
  • 从地狱中删除原始段落。
function sentenceMe() {
  var doc = DocumentApp.getActiveDocument();
  var paragraphs = doc.getBody().getParagraphs();
  var sentences = [];
  // Split paragraphs into sentences
  for (var i = 0; i < paragraphs.length; i++) {
    var parText = paragraphs[i].getText();
    //Count sentences in Hebrew/English/digits that end with 1 or more of either ".","?" or "!"
    var sentEnds = parText.match(/[a-zA-Z0-9_\u0590-\u05fe][.?!](\s|$)|[.?!][.?!](\s|$)/g);
    if (sentEnds){
      for (var j=0; j< sentEnds.length; j++){
        var initIdx = 0;
        var sentence = parText.substring(initIdx,parText.indexOf(sentEnds[j])+3);
        var parInitIdx = initIdx;
        initIdx = parText.indexOf(sentEnds[j])+3;
        parText = parText.substring(initIdx - parInitIdx);
        sentences.push(sentence);
      }

    }
    // console.log(sentences);
  }

  inThrees(doc, paragraphs, sentences)
}

function inThrees(doc, paragraphs, sentences) {
  // define offset
  var offset = paragraphs.length;
  // Create paragraphs with up to 3 sentences
  var k=0;
  do {
    var parText = sentences.splice(0,3).join(' ');
    doc.getBody().insertParagraph(k + offset  , parText.concat('\n'));
    k++
  }
  while (sentences.length > 0)

    // Remove paragraphs from hell
    for (var i = 0; i < offset; i++){
      doc.getBody().removeChild(paragraphs[i]);
    }
}

如果您想了解自定义菜单,请看这里:

function onOpen() {
  var ui = DocumentApp.getUi();
  ui.createMenu('Custom Menu')
  .addItem("3's the magic number", 'sentenceMe')
  .addToUi();
}

参考文献: