2017-12-27 1048 views
1

我试图获取字符串中最后2个括号之间的所有大写字母。到目前为止,我已经试过这样:字符串中最后2个括号之间的所有大写字母的正则表达式

/\(([A-Z])([^)]*)\)[^(]*$/g 

。例如:我不希望(这些词),我想(这两个)

,但它给了我:

组1 。T

集团2 hese Two

有人能帮助我吗?

在此先感谢!

+0

所以,你希望所有的信件,不只是大写字母?你想要什么答案? – NetMage

+0

如果你得到最后一个左括号的索引,然后得到最后一个右括号的索引,并得到这些索引之间的子串,*然后*得到大写字母,那么维护会更容易。即使你的正则表达式工作正常,你也无法在几个月内理解这个正则表达式。 – Amy

+0

您的字符串可以有多组圆括号吗?是否有错误的情况下有不匹配的括号?或者,总是只有两个你必须处理和没有错误条件? – Highdown

回答

2

我认为,最短,最简单的解决方法是:

  • (?!.*\() - 负前瞻 - 无处以后会出现的任何 左括号(之后的任何数量的其他字符),
  • (?=.*\)) - 积极的前瞻 - 某处稍后必须 出现右括号(任意数量的其他字符之后),
  • [A-Z] - 抓住一个大写字母,而不是作为一个捕获组, 但作为一个“正常”的比赛,
  • g - 随着全球选项。

综上所述:

/(?!.*\()(?=.*\))[A-Z]/g 
0

你可以在JavaScript中括号内包装为后续的最后一个字符串之间的所有字母大写:

/(?!.*\()(?=.*\))([A-Z])/g 

其中第一部分(?!.*\(.*\))是忽略所有的开括号后立即停止负前瞻最后一个。然后,我们执行一个正面预测,它匹配所有内容,直到遇到关闭的括号。然后我们匹配大写字母。

0

代码

var s = "I don't want (These Words), I want (These Two)" 
 
var r = /.*\(([^)]*)\)/ 
 
var m = r.exec(s) 
 

 
console.log(m[1].match(/[A-Z]/g))


说明

一正则表达式

第一个正则表达式.*\(([^)]*)\).*提取的最后一个括号中的内容。

  • .*匹配任何字符任意次数
  • \(匹配左括号字面上
  • ([^)]*)捕捉除右括号的任何字符的任何数量的次进入捕获组1
  • \)匹配右括号字面上
  • .*匹配任何字符的次数

二正则表达式

第二个正则表达式[A-Z]匹配大写字母

+0

谢谢,但没有办法在一个表达式中做到这一点? s.match(/.* \(([^)] *)\)。* /)[1] .match(/ [AZ]/g).join('') 可以工作,如果我可以把它放在1个正则表达式中,d会更好 –

+0

@TimVN为什么人们总是这样问?哈哈......当你谈论可变长度元素的可能性时,它不是JavaScript。如果你总是有2个单词,你可以使用'。* \(([AZ])[^ AZ]([AZ])'获得第一个和第二个捕获组,但是当你增加这个可能性时, ([AZ])(?:[^ AZ]([AZ]))? - > 1或2,'。* \(([AZ])或更少,您的表情变得非常复杂:'。* \ (?:[^ AZ]([AZ]))?(?:[^ AZ]([AZ]))?' - > 1,2或3等 – ctwheels

+0

@TimVN在其他正则表达式引擎中, 。JavaScript的正则表达式支持并不是很棒,例如,PCRE允许'\ G'和'\ K'这使得这非常容易:['(?:。* \(| \ G(?!\ A))[^AZ] * \ K [AZ]'](https://regex101.com/r/9e2GLA/1/),但这些在JavaScript中不可用,您可以在没有'\ K'的情况下这样做:[' (?:。* \(| \ G(?!\ A))[^ AZ] *([AZ])'](https://regex101.com/r/9e2GLA/2),但又是'\ G '不支持在JavaScript中 – ctwheels

相关问题