【问题标题】:Regular expression to extract Words inside nested parentheses正则表达式提取嵌套括号内的单词
【发布时间】:2018-03-23 09:45:21
【问题描述】:

我正在寻找能够执行此任务的正则表达式

消息正文输入:Test1 (Test2) (test3) (ti,ab(text(text here(possible text)text(possible text(more text))))) end (text)

我想要的结果结果:(text(text here(possible text)text(possible text(more 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);

【问题讨论】:

  • JavaScript 不允许您以这种方式使用正则表达式。要匹配括号,您需要递归或平衡表达式,这是 JavaScript 不支持的。
  • 这可能不适合在 JavaScript 中使用正则表达式,因为没有合适的方法来匹配括号。您可能会更好地匹配组的开头,然后逐步遍历字符串的其余部分以计算括号。
  • 我怎样才能解决我用javascript退出这种任务的新方法
  • 你确定字符串是这样的吗?因为这里()的数量是不平衡的。 end之前不是缺少一个)吗?
  • @WiktorStribiżew 感谢您的评论我已更正(现在它们已平衡

标签: regex google-apps-script


【解决方案1】:

您可以在这里使用的唯一解决方案是提取括号内的所有子字符串,然后过滤它们以获取所有以 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) - 1 个备选方案,
  • (?:,(ti|ab|su))* - , 的 0 次或多次重复,后跟 3 个备选方案中的 1 个
  • \( - 一个(

匹配被替换为(以在匹配中恢复它。

【讨论】:

  • 是否有可能只得到(text(text here(possible text)text(possible text(more text)))) 作为结果ti,ab
  • @Moka 查看编辑。 .map 将从找到的所有匹配项中删除所有 ti,ab( 和最后一个 )
  • @Moka 如果您需要那些以ab(ti( 开头的子字符串,请将@​​987654343@ 替换为/^(?:ti|ab)\(/.test(x)
  • @I'-'I 它不起作用,因为end 是占位符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多