regex - 正则表达式提取嵌套括号内的单词

标签 regex google-apps-script

我正在寻找能够完成此任务的正则表达式

消息正文输入: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/

相关文章:

r - 如何抓取 "-"之后的一些字符?

PHP正则表达式匹配单词

google-apps-script - 如何创建自动脚本以将Google Analytics(分析)仪表板复制到Google电子表格中

javascript - 带有服务器集成的 PayPal 客户端 JavaScript SDK - 设置付款金额

javascript - 简单搜索电子表格中的所有工作表

regex - Groovy:如何检查一个列表是否包含来自另一个包含正则表达式格式的列表的项目

regex - 在 Bash 中的一行内交换字符串

c# - 检查字符串的任何子字符串是否包含字母和数字的组合

javascript - 通过 Javascript 方法从 Google 电子表格获取光标行/列

html - 从工作表填写侧边栏表单