Google Docs中FindText懒正则匹配失效,无法逐个提取标签求助
问题根源:你取的是整个元素的文本,而非匹配的片段
你遇到的问题根本不是懒匹配没生效——实际上你的正则<.*?>是正常工作的,问题出在你获取文本的方式上!
当你调用body.findText("<.*?>").getElement().getText()时,getElement()会返回匹配结果所在的整个文档元素(比如整个段落、整个文本框),而getText()自然就返回了这个元素的全部内容,也就是<dear> <person>,而不是正则匹配到的单个标签片段。
正确提取单个匹配文本的方法
要拿到正则匹配的具体内容,你需要利用findText()返回的RangeElement对象提供的偏移量,从元素文本中截取对应部分:
const firstMatch = body.findText("<.*?>"); if (firstMatch) { // 将元素转为Text类型(确保是文本元素) const textElement = firstMatch.getElement().asText(); // 用偏移量截取匹配的文本:注意endOffset要+1,因为substring是左闭右开 const matchedTag = textElement.getText().substring( firstMatch.getStartOffset(), firstMatch.getEndOffsetInclusive() + 1 ); Logger.log(matchedTag); // 这里会输出<dear> }
逐个提取所有标签的完整代码
如果要遍历所有匹配的标签,你可以循环调用findText(),每次把上一个匹配结果作为第二个参数传入,直到没有匹配为止:
let currentMatch = body.findText("<.*?>"); while (currentMatch) { const textElement = currentMatch.getElement().asText(); const matchedTag = textElement.getText().substring( currentMatch.getStartOffset(), currentMatch.getEndOffsetInclusive() + 1 ); Logger.log(matchedTag); // 依次输出<dear>、<person> // 查找下一个匹配 currentMatch = body.findText("<.*?>", currentMatch); }
验证懒匹配是否生效
你可以用上面的代码测试,会发现正则确实按懒匹配的方式找到了第一个<dear>,然后是<person>——之前的误解完全是因为错误地获取了整个元素的文本。
内容的提问来源于stack exchange,提问作者tkalir
相关产品推荐
相关产品推荐

