获取两个圆括号之间的文本

70
我怎样才能使用 JavaScript 中的正则表达式从以下句子的两个括号中提取出单词 my

"This is (my) simple text"

(译者注:正则表达式是一种用来匹配、查找和操作文本的工具,使用它可以更方便地处理字符串。)
7个回答

133

console.log(
  "This is (my) simple text".match(/\(([^)]+)\)/)[1]
);

\( 表示开始大括号,( 表示子表达式的开始,[^)]+ 表示除了右括号之外的任何字符出现一次或多次(你可能需要用 * 替换 +),) 表示子表达式的结束,\) 表示结束大括号。函数 match() 返回数组 ["(my)","my"],从中提取第二个元素。


2
你也可以使用.+?代替[^)]+ - Ry-
1
是的,有很多种方法可以完成这个任务。 - Michael Krelin - hacker
1
+1 很好,运行得很顺利。我想请你在你的代码中添加这个链接 http://tinyurl.com/mog7lr3 以获得一个视觉解释。谢谢。 - Praveen
如果有多个结果,请使用.match(/\{(.+?)\}/g) - Stefan
“this” 是指哪个?你要将它应用到什么上面? - Michael Krelin - hacker
显示剩余3条评论

20
var txt = "This is (my) simple text";
re = /\((.*)\)/;
console.log(txt.match(re)[1]);​

jsFiddle示例


2
如果我们将txt更改为txt ='This is (my) (simple) text',它会输出'my) (simple'。我们如何只获取'my'?我们如何仅获取匹配括号内的内容? - smita chougale
1
@smita 将 (.) 更改为 (.?) 以进行非贪婪匹配。 - skot

17

你也可以尝试一种非正则表达式的方法(当然,如果有多个这样的括号,最终需要循环或者使用正则表达式)

init = txt.indexOf('(');
fin = txt.indexOf(')');
console.log(txt.substr(init+1,fin-init-1))

4
更易使用的“子字符串”方法:txt.substring(init + 1, fin) - Ry-
1
没错。速度可能不是问题,但通常正则表达式匹配是耗时的。 - SexyBeast
@Cupidvogel,在这种情况下问题是什么,这就是问题所在。我不清楚我的正则表达式将给出的结果是否正确。当然,您可以将其更改为[^()],但是是否正确也不清楚。 而且,不仅仅是性能,而是关于使用正则表达式做所有事情的普遍趋势,如果您添加了一些检查,我会点赞您的答案;-) - Michael Krelin - hacker
嗯,这在很大程度上取决于原始意图,但使用 fin < init 看起来不像是正确的做法。你可以 (a) 从开头开始搜索关闭括号,(b) 找到最后一个关闭括号,(c) 无论人们想出什么方法 ;-) - Michael Krelin - hacker
看起来是一项艰巨的工作。难怪人们会使用正则表达式! - SexyBeast
显示剩余3条评论

9
对于需要在多个括号中返回多个文本的任何人。
var testString = "(Charles) de (Gaulle), (Paris) [CDG]"
var reBrackets = /\((.*?)\)/g;
var listOfText = [];
var found;
while(found = reBrackets.exec(testString)) {
  listOfText.push(found[1]);
};

8

使用此方法获取最接近的 () 之间的文本:

const string = "This is (my) (simple (text)"
console.log( string.match(/\(([^()]*)\)/)[1] )
console.log( string.match(/\(([^()]*)\)/g).map(function($0) { return $0.substring(1,$0.length-1) }) )

结果my["my","text"]

解释

--------------------------------------------------------------------------------
  \(                       '('
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    [^()]*                   any character except: '(', ')' (0 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  \)                       ')'

1
不错的一行代码,我会使用它。 - user1503606

2
从字符串公式中获取字段。
var txt = "{{abctext/lsi)}} = {{abctext/lsi}} + {{adddddd}} / {{ttttttt}}";
re = /\{{(.*?)\}}/g;
console.log(txt.match(re));

0

使用圆括号返回多个项

 var res2=str.split(/(|)/);

  var items=res2.filter((ele,i)=>{
  if(i%2!==0) {
  return ele;
  }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接