【问题标题】:Regexp, capture between parentheses, javascript正则表达式,括号之间的捕获,javascript
【发布时间】:2016-10-27 08:17:49
【问题描述】:

我有正则表达式,可以提取括号之间的值。

它大部分时间都在工作,但当它以括号结尾时就不行

var val = 'STR("ABC(t)")';
var regExp = /\(([^)]+)\)/;.
var matches = regExp.exec(val);
    ​
console.log(matches[1]); //"ABC(t"

我想要的是"ABC(t)".

有什么想法可以修改我的正则表达式来实现这个吗?

更新 该值始终在括号内。

一些例子:

'ASD("123")'; => '123'
'ASD(123)'; => '123'
'ASD(aa(10)asda(459))'; => 'aa(10)asda(459)'

所以首先有一些文本(总是文本)。然后有一个(,它总是以一个)结尾。我想要之间的值。

【问题讨论】:

  • 你逃脱了错误的关闭),所以你的捕获组结束,然后你匹配)(当它应该是相反的时候)。投票偏离主题,因为问题是印刷错误。
  • 除非对输入有特定限制,否则使用正则表达式很难解决。根据输入中允许的内容和不允许的内容,只有实际的解析器才能正确执行此操作。
  • 这种情况下'some text (num(10a ) ss) STR("ABC(t)")'应该匹配什么?
  • /("\w+\(.*?\)")/ 在这种情况下应该可以工作。
  • 如果字符串不是较长字符串的一部分,/\((.+)\)/ 可以。需要有关输入的更多详细信息。

标签: javascript regex


【解决方案1】:

您可以在第 1 组模式中使用贪心点匹配:/\((.+)\)/。它将匹配第一个 (,然后是除换行符以外的任何 1+ 字符,然后是行中的最后一个 )

var vals = ['STR("ABC(t)")', 'ASD("123")', 'ASD(123)', 'ASD(aa(10)asda(459))'];
var regExp = /\((.+)\)/;
for (var val of vals) {
  var matches = regExp.exec(val);
  console.log(val, "=>", matches[1]);
}

回答评论:如果要提取的文本必须在嵌套的平衡括号内,那么一个小的解析代码或XRegExp#matchRecursive 可以提供帮助。由于SO上有很多解析代码,我将提供XRegExp示例:

var str = 'some text (num(10a ) ss) STR("ABC(t)")';
var res = XRegExp.matchRecursive(str, '\\(', '\\)', 'g');
console.log(res);
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/2.0.0/xregexp-all-min.js"></script>

【讨论】:

  • 你应该在测试数据集中包含some text (num(10a ) ss) STR("ABC(t)") ;) :)
  • @GreenAsJade:不,OP 没有这样的文本。无论如何,我也可以为这个字符串添加一个解决方案。需要吗?
  • 我只是在开玩笑说 cmets 中的问题。 cmets 中的问题旨在说明正则表达式是否旨在解析匹配的括号,我认为不是。
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 2013-05-04
  • 2022-11-04
相关资源
最近更新 更多