我正在寻找能够完成此任务的正则表达式
消息正文输入:Test1 (Test2) (test3) (ti,ab(text(此处的文本(可能的文本)text(可能的文本(更多文本))))) end (文本)
我想要的结果结果:(text(此处的文本(可能的文本)text(可能的文本(更多文本))))
我想收集ti,ab(................)内的所有内容
var messageBody = message.getPlainBody()
var ssFile = DriveApp.getFileById(id);
DriveApp.getFolderById(folder.getId()).addFile(ssFile);
var ss = SpreadsheetApp.open(ssFile);
var sheet = ss.getSheets()[0];
sheet.insertColumnAfter(sheet.getLastColumn());
SpreadsheetApp.flush();
var sheet = ss.getSheets()[0];
var range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn() + 1)
var values = range.getValues();
values[0][sheet.getLastColumn()] = "Search Strategy";
for (var i = 1; i < values.length; i++) {
//here my Regexp
var y = messageBody.match(/\((ti,ab.*)\)/ig);
if (y);
values[i][values[i].length - 1] = y.toString();
range.setValues(values);
最佳答案
这里您可以使用的唯一解决方案是提取括号内的所有子字符串,然后过滤它们以获取所有以 ti,ab
开头的子字符串:
var a = [], r = [], result;
var txt = "Test1 (Test2) (test3) (ti,ab(text(text here(possible text)text(possible text(more text))))) end (text)";
for(var i=0; i < txt.length; i++){
if(txt.charAt(i) == '(') {
a.push(i);
}
if(txt.charAt(i) == ')') {
r.push(txt.substring(a.pop()+1,i));
}
}
result = r.filter(function(x) { return /^ti,ab\(/.test(x); })
.map(function(y) {return y.substring(6,y.length-1);})
console.log(result);
嵌套括号函数借自 Nested parentheses get string one by one 。 /^ti,ab\(/
正则表达式与字符串开头的 ti,ab(
匹配。
上述解决方案允许提取嵌套括号内的嵌套括号。如果不需要,请使用
var txt = "Test1 (Test2) ((ti,ab(text(text here))) AND ab(test3) Near Ti(test4) NOT ti,ab,su(test5) NOT su(Test6))";
var start=0, r = [], level=0;
for (var j = 0; j < txt.length; j++) {
if (txt.charAt(j) == '(') {
if (level === 0) start=j;
++level;
}
if (txt.charAt(j) == ')') {
if (level > 0) {
--level;
}
if (level === 0) {
r.push(txt.substring(start, j+1));
}
}
}
console.log("r: ", r);
var rx = "\\b(?:ti|ab|su)(?:,(ti|ab|su))*\\(";
var result = r.filter(function(y) { return new RegExp(rx, "i").test(y); })
.map(function(x) {
return x.replace(new RegExp(rx, "ig"), '(')
});
console.log("Result:",result);
用于过滤和删除不必要的单词的模式
\b(?:ti|ab|su)(?:,(ti|ab|su))*\(
详细信息
\b
- 单词边界(?:ti|ab|su)
- 替代方案之一,(?:,(ti|ab|su))*
- 0 次或多次重复,
后跟 3 个替代方案中的 1 个\(
- 一个(
.
比赛被替换为(
以在比赛中恢复它。
关于regex - 正则表达式提取嵌套括号内的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49446609/