如何将 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 可以解决问题?
谢谢。
- 注意:我使用句子的最后 10 个字符,假设匹配将是唯一的,足以只进行 1 次替换。
其实句子的检测并不是一件容易的事
一个句子并不总是以点、问号或感叹号结尾。如果句子以引号结尾,则某些国家/地区的标点符号规则会强制您将句末标记放在引号内:
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
这会查找 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();
}
参考文献:
我希望段落最多只有 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 可以解决问题?
谢谢。
- 注意:我使用句子的最后 10 个字符,假设匹配将是唯一的,足以只进行 1 次替换。
其实句子的检测并不是一件容易的事
一个句子并不总是以点、问号或感叹号结尾。如果句子以引号结尾,则某些国家/地区的标点符号规则会强制您将句末标记放在引号内:
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
这会查找 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();
}