ChatGPT解决这个技术问题 Extra ChatGPT

正则表达式在Javascript中获取括号之间的字符串

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

I expect five hundred dollars ($500).

会回来

$500

找到 Regular Expression to get a string between two strings in Javascript

但我是正则表达式的新手。我不知道如何在正则表达式中使用 '(', ')'

您可以使用下面的 go-oleg 解决方案,稍作修改以测试美元符号:var regExp = /\(\$([^)]+)\)/;
很高兴看到你到目前为止所做的尝试。

u
user1063287

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

var 正则表达式 = /\(([^)]+)\)/; var matches = regExp.exec("我预计五百美元 ($500)。"); //matches[1] 包含括号之间的值 console.log(matches[1]);

分解:

\( :匹配左括号

: 开始捕获组

[^)]+: 匹配一个或多个非 ) 字符

: 结束捕获组

\) : 匹配右括号

以下是关于 RegExplained 的直观说明


+1 很好,就像一个魅力。我想将您添加到您的 tinyurl.com/mog7lr3 中以获得直观的解释。
如果要捕获的括号内有括号,则此方法不起作用。如:“我预计五百美元(500 美元(但我知道我再也见不到那笔钱了))。
此正则表达式仅在每个字符串匹配一个实例时才有效。使用全局 /g 标志不会按预期工作。
@IanWarburton,matches[0] 为您提供匹配 '($500)' 的完整字符串,而 matches[1] 为您提供捕获组中的内容。这是有关 regExp.match() 的返回值的更多信息。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
如果括号中有多个字符串,如下所示,解决方案是什么:“我期望(五)百美元(500 美元)”假设我想要一个包含这些特殊字符串的数组。
M
Mr_Green

尝试字符串操作:

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]);
}

或正则表达式(有点slow compare to the above

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));
}

今天在 Chrome 59.0.3071 中运行那个 jsperf,正则表达式快了 8%
A
Ali Soltani

简单的解决方案

注意:此解决方案可用于仅具有单个“(”和“)”的字符串,例如此问题中的字符串。

("I expect five hundred dollars ($500).").match(/\((.*)\)/).pop();

Online demo (jsfiddle)


添加可选链接以防匹配不存在将返回 undefined 而不是导致未捕获的异常 (“我预计五百美元 ($500)。”).match(/((.*))/)?.pop();
W
Wiktor Stribiżew

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

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

图案。请参阅the regex demo

在 JavaScript 中,像这样使用它

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

图案细节

\( - 一个 ( 字符

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

\) - a) 字符。

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

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

const strs = ["我期望五百美元 ($500).", "我期望.. :( 五百美元 ($500)."]; const rx = /\(([^()]*)\)/ g; strs.forEach(x => { const matches = [...x.matchAll(rx)]; console.log( Array.from(matches, m => m[0]) ); // 全部匹配values console.log( Array.from(matches, m => m[1]) ); // 所有第 1 组值 });

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

var strs = ["我期望五百美元 ($500).", "我期望.. :( 五百美元 ($500)."]; var rx = /\(([^()]*)\)/ g; for (var i=0;i


这个正则表达式非常棒,因为它只捕获成对的 () 及其内容,即使是并排的()() 也是如此。
@limitlessloop 因为这似乎是一个有用的答案,所以我还添加了一个新的基于 matchAll 的 JavaScript 代码演示。
这个答案是最好的。
如何包括括号,你能举个例子吗?
@postgresnewbie 它已经在那里了,console.log( Array.from(matches, m => m[0]) ); // All full match values。此时您不需要该组,并且可以使用 var rx = /\([^()]*\)/g;
C
Community

Mr_Green's answer 移植到函数式编程风格以避免使用临时全局变量。

var matches = string2.split('[')
  .filter(function(v){ return v.indexOf(']') > -1})
  .map( function(value) { 
    return value.split(']')[0]
  })

我一直在寻找什么。 stackoverflow.com/questions/49614116/…
m
marcofriso

选择:

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

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


str 没有括号时,这会被破坏
P
P0W

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

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


这将适用于示例文本,但是如果另一个 ) 稍后出现在像 I expect five hundred dollars ($500). (but I'm going to pay). 这样的字符串中,则 + 的贪婪将捕获更多。
@Denomales 那么你如何让它捕获这些字符串的两个实例。理想情况下,我正在做类似的事情,但我希望:($500)(but I'm going to pay) 匹配但在两个单独的匹配中,而不是被视为单个匹配项?提前致谢!
(.+) 满足我的要求。需要捕获诸如“Dunhill(瓶/包/锅/镜头)”之类的东西,然后只返回“Dunhill”
A
Andran

let str = "括号前(括号内)括号后".replace(/.*\(|\).*/g, ''); console.log(str) // 括号内


A
AJ Dhaliwal
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


B
Bryan Henrique Cruz

简单:(?<value>(?<=\().*(?=\)))

我希望我有所帮助。