使用惰性正则表达式从 Google 文档中提取所有标签
Extract all tags from a Google Document using a lazy regex
我有一份 Google Docs 文档,其中包含 <dear> <person>
行,我希望 FindText 一次 return 一个标签。我用这条线:
Logger.log(body.findText("<.*?>").getElement().getText());
它记录 <dear> <person>
而不仅仅是 <dear>
。
我想由于某种原因,匹配在 "lazy" 模式下不起作用,但我在 https://regex101.com 上 运行 它显示了两个标签作为两个不同的匹配项。
我做错了什么?
问题不在于懒惰,而是在于懒惰。你的正则表达式 是 懒惰的。方法 findText
returns a RangeElement
,其中包含有关比赛开始和结束的信息。问题是您调用了 getElement
,return 是包含匹配项的整个元素。所以结果是包含匹配文本的整个段落(或另一个元素)。
要正确提取匹配文本,请使用isPartial
检查匹配是否只是元素的一部分;如果是这样,请获取开始和结束位置并将文本切片,如下所示。
function search() {
var body = DocumentApp.getActiveDocument().getBody();
var pattern = "<.*?>";
var found = body.findText(pattern);
while (found) {
var text = found.getElement().getText();
if (found.isPartial()) {
var start = found.getStartOffset();
var end = found.getEndOffsetInclusive();
text = text.slice(start, end+1);
}
Logger.log(text);
found = body.findText(pattern, found);
}
}
备注:
- 在 Apps 脚本中,结束偏移量是包含在内的;在
String.slice
方法中不是。这就是 slice
. 中 end+1
的原因
- 循环是 return 所有结果所必需的。
findText
只找到一个匹配项,这里称为 found
。然后这个匹配被传递给 findText
作为它的第二个参数,所以它找到 next 匹配。
我有一份 Google Docs 文档,其中包含 <dear> <person>
行,我希望 FindText 一次 return 一个标签。我用这条线:
Logger.log(body.findText("<.*?>").getElement().getText());
它记录 <dear> <person>
而不仅仅是 <dear>
。
我想由于某种原因,匹配在 "lazy" 模式下不起作用,但我在 https://regex101.com 上 运行 它显示了两个标签作为两个不同的匹配项。
我做错了什么?
问题不在于懒惰,而是在于懒惰。你的正则表达式 是 懒惰的。方法 findText
returns a RangeElement
,其中包含有关比赛开始和结束的信息。问题是您调用了 getElement
,return 是包含匹配项的整个元素。所以结果是包含匹配文本的整个段落(或另一个元素)。
要正确提取匹配文本,请使用isPartial
检查匹配是否只是元素的一部分;如果是这样,请获取开始和结束位置并将文本切片,如下所示。
function search() {
var body = DocumentApp.getActiveDocument().getBody();
var pattern = "<.*?>";
var found = body.findText(pattern);
while (found) {
var text = found.getElement().getText();
if (found.isPartial()) {
var start = found.getStartOffset();
var end = found.getEndOffsetInclusive();
text = text.slice(start, end+1);
}
Logger.log(text);
found = body.findText(pattern, found);
}
}
备注:
- 在 Apps 脚本中,结束偏移量是包含在内的;在
String.slice
方法中不是。这就是slice
. 中 - 循环是 return 所有结果所必需的。
findText
只找到一个匹配项,这里称为found
。然后这个匹配被传递给findText
作为它的第二个参数,所以它找到 next 匹配。
end+1
的原因