正则表达式以获取Java括号中的字符串


176

我正在尝试编写一个正则表达式,该表达式返回括号之间的字符串。例如:我想获取位于字符串“(”和“)”之间的字符串

I expect five hundred dollars ($500).

会回来

$500

找到正则表达式以获取Javascript中两个字符串之间的字符串

但是我对regex并不陌生。我不知道如何在正则表达式中使用'(',')'



您可以在下面使用经过改进的go-oleg解决方案来测试美元符号:var regExp = /\(\$([^)]+)\)/;
2013年

Answers:


454

您需要创建一组转义的(带有\)括号(与括号匹配)和一组常规的括号来创建捕获组:

var regExp = /\(([^)]+)\)/;
var matches = regExp.exec("I expect five hundred dollars ($500).");

//matches[1] contains the value between the parentheses
console.log(matches[1]);

分解:

  • \( :匹配左括号
  • ( :开始捕获组
  • [^)]+:匹配一个或多个非)字符
  • ) :结束捕获组
  • \) :匹配右括号

这是RegExplained的直观说明


12
+1不错,运作起来很迷人。我想添加您,以便您在视觉上添加此tinyurl.com/mog7lr3
Praveen

5
@ user1671639:已更新。感谢您的链接!
go-oleg 2013年

5
如果要捕获的括号中有括号,则此方法不起作用。例如:“我希望有500美元(500美元(但我知道我再也看不到那笔钱了))”。
JayB 2015年

1
仅当每个字符串匹配一个实例时,此正则表达式才有效。使用全局/g标志将无法按预期工作。
silkAdmin 2015年

2
如果您在圆括号内有多个字符串,例如:“我希望(五)百美元(500美元)”,那该怎么办呢?假设我要这些特殊字符串的数组。
Mohamad Al Asmar '18年

33

尝试字符串操作:

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var newTxt = txt.split('(');
for (var i = 1; i < newTxt.length; i++) {
    console.log(newTxt[i].split(')')[0]);
}

或正则表达式(其被稍微慢比较上述

var txt = "I expect five hundred dollars ($500). and new brackets ($600)";
var regExp = /\(([^)]+)\)/g;
var matches = txt.match(regExp);
for (var i = 0; i < matches.length; i++) {
    var str = matches[i];
    console.log(str.substring(1, str.length - 1));
}

7
今天在Chrome 59.0.3071中运行该jsperf,该正则表达式的运行速度提高了8%
Alex McMillan



5

对于货币符号后的数字:\(.+\s*\d+\s*\)应该有效

\(.+\)括号内的任何内容


2
这将适用于示例文本,但是,如果)字符串的后面出现另一个,例如I expect five hundred dollars ($500). (but I'm going to pay).的贪婪性,+则会捕获更多内容。
Ro Yo Mi

@Denomales因此,您将如何捕获这些字符串的两个实例。理想情况下,我正在做类似的事情,但我希望拥有: ($500)并且(but I'm going to pay) 被匹配,但要进行两次单独的匹配,而不是被视为单个匹配项?提前致谢!
汤姆·伯德

(。+)符合我的要求。需要捕获“ Dunhill(瓶/包/罐/罐/枪)”之类的东西并仅返回“ Dunhill”
GentleGiant

5

要匹配括号内的子字符串(不包括任何内部括号),可以使用

\(([^()]*)\)

模式。见正则表达式演示

在JavaScript中,像

var rx = /\(([^()]*)\)/g;

图案细节

  • \(-一个(字符
  • ([^()]*)-捕获组1:与除和之外的任何0个或多个字符匹配的否定字符类()
  • \)-一个)字符

要获取整个匹配项,请获取组0值,如果需要括号内的文本,请获取组1值。

最新的JavaScript代码演示(使用matchAll):

const strs = ["I expect five hundred dollars ($500).", "I expect.. :( five hundred dollars ($500)."];
const rx = /\(([^()]*)\)/g;
strs.forEach(x => {
  const matches = [...x.matchAll(rx)];
  console.log( Array.from(matches, m => m[0]) ); // All full match values
  console.log( Array.from(matches, m => m[1]) ); // All Group 1 values
});

旧版JavaScript代码演示(符合ES5):


这个正则表达式很棒,因为它()即使在并排时也仅捕获对及其内容()()
limitlessloop

1
@limitlessloop因为这似乎是一个有用的答案,所以我还添加了一个新的matchAll基于JavaScript的代码演示。
WiktorStribiżew

3

let str = "Before brackets (Inside brackets) After brackets".replace(/.*\(|\).*/g, '');
console.log(str) // Inside brackets


2

选择:

var str = "I expect five hundred dollars ($500) ($1).";
str.match(/\(.*?\)/g).map(x => x.replace(/[()]/g, ""));
 (2) ["$500", "$1"]

如果需要,可以将方括号替换为方括号或大括号


1
var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/;
alert(rex.exec(str));

将匹配第一个数字,以$开头,后跟')'。')'将不参与比赛。该代码以第一个匹配项发出警报。

var str = "I expect five hundred dollars ($500) ($1).";
var rex = /\$\d+(?=\))/g;
var matches = str.match(rex);
for (var i = 0; i < matches.length; i++)
{
    alert(matches[i]);
}

此代码会提示所有匹配项。

参考文献:

搜索“?= n” http://www.w3schools.com/jsref/jsref_obj_regexp.asp

搜索“ x(?= y)” https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/RegExp

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.