我一辈子都不明白为什么这个正则表达式会吞噬谷歌文档中的整行内容。当我运行这个时,我不能让它只返回{{ClientName}}
这是我的文档中的文本。
{{ClientName}} would like to have a {{Product}} {{done/created}}. The purpose of this {{Product}} is to {{ProductPurpose}}. We have experience with such testing and development, and will develop and test the {{Product}} for {{ClientName}}.
function searchAndFind () {
var foundText = DocumentApp.getActiveDocument().getBody().findText('{{([^,s}{][a-zA-Z]+)}}').getElement().asText().getText()
return foundText
}
问题:
这是因为findText()
返回一个RangeElement
对象,该对象提供了获取Element
中实际匹配文本的全文Element
和offset
的方法。当您使用getElement()
时,您将获得整个元素,而不仅仅是匹配的字符串。
解决方案:
获取range元素的偏移量,以获取元素中的实际文本。
代码段:
function searchAndFind() {
var rangeElement = DocumentApp.getActiveDocument()
.getBody()
.findText('{{([^,\s]+)}}');
return rangeElement
.getElement()
.asText()
.getText()
.substring(
rangeElement.getStartOffset(),
rangeElement.getEndOffsetInclusive()+1
);
}
参考文献:
- FindText
- RangeElement
- 字符串#子字符串
试试这个:
function searchAndFind () {
var foundElement = DocumentApp.getActiveDocument().getBody().findText('{{([^,s}{][a-zA-Z]+)}}').getElement().asText().getText();
var start=DocumentApp.getActiveDocument().getBody().findText('{{([^,s}{][a-zA-Z]+)}}').getStartOffset();
var end=DocumentApp.getActiveDocument().getBody().findText('{{([^,s}{][a-zA-Z]+)}}').getEndOffsetInclusive();
var foundText=foundElement.slice(start,end+1);
Logger.log('nfoundElement: %snstart: %snend: %snfoundText:%sn',foundElement,start,end,foundText);
return foundText;
Logger.log输出:
[18-12-11 13:04:34:863 MST]
foundElement: {{ClientName}} would like to have a {{Product}} {{done/created}}. The purpose of this {{Product}} is to {{ProductPurpose}}. We have experience with such testing and development, and will develop and test the {{Product}} for {{ClientName}}.
start: 0.0
end: 13.0
foundText:{{ClientName}}
Regex默认为"贪婪"。你可以使一个量词(如+
、?
、*
或{}
(不贪婪,方法是在量词后面加上?
。
例如:
x??
x*?
x+?
x{n}?
x{n,}?
x{n,m}?
修改正则表达式以利用此功能。
查看MDN上的regex文档,并搜索(chrome中的CTRL+F(术语"贪婪"以获取更多信息。