我试图获取字符串中最后2个括号之间的所有大写字母。到目前为止,我已经试过这样:字符串中最后2个括号之间的所有大写字母的正则表达式
/\(([A-Z])([^)]*)\)[^(]*$/g
。例如:我不希望(这些词),我想(这两个)
,但它给了我:
组1 。T
集团2 hese Two
有人能帮助我吗?
在此先感谢!
我试图获取字符串中最后2个括号之间的所有大写字母。到目前为止,我已经试过这样:字符串中最后2个括号之间的所有大写字母的正则表达式
/\(([A-Z])([^)]*)\)[^(]*$/g
。例如:我不希望(这些词),我想(这两个)
,但它给了我:
组1 。T
集团2 hese Two
有人能帮助我吗?
在此先感谢!
我认为,最短,最简单的解决方法是:
(?!.*\()
- 负前瞻 - 无处以后会出现的任何 左括号(之后的任何数量的其他字符),(?=.*\))
- 积极的前瞻 - 某处稍后必须 出现右括号(任意数量的其他字符之后),[A-Z]
- 抓住一个大写字母,而不是作为一个捕获组, 但作为一个“正常”的比赛,g
- 随着全球选项。综上所述:
/(?!.*\()(?=.*\))[A-Z]/g
你可以在JavaScript中括号内包装为后续的最后一个字符串之间的所有字母大写:
/(?!.*\()(?=.*\))([A-Z])/g
其中第一部分(?!.*\(.*\))
是忽略所有的开括号后立即停止负前瞻最后一个。然后,我们执行一个正面预测,它匹配所有内容,直到遇到关闭的括号。然后我们匹配大写字母。
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]
匹配大写字母
谢谢,但没有办法在一个表达式中做到这一点? s.match(/.* \(([^)] *)\)。* /)[1] .match(/ [AZ]/g).join('') 可以工作,如果我可以把它放在1个正则表达式中,d会更好 –
@TimVN为什么人们总是这样问?哈哈......当你谈论可变长度元素的可能性时,它不是JavaScript。如果你总是有2个单词,你可以使用'。* \(([AZ])[^ AZ]([AZ])'获得第一个和第二个捕获组,但是当你增加这个可能性时, ([AZ])(?:[^ AZ]([AZ]))? - > 1或2,'。* \(([AZ])或更少,您的表情变得非常复杂:'。* \ (?:[^ AZ]([AZ]))?(?:[^ AZ]([AZ]))?' - > 1,2或3等 – ctwheels
@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
所以,你希望所有的信件,不只是大写字母?你想要什么答案? – NetMage
如果你得到最后一个左括号的索引,然后得到最后一个右括号的索引,并得到这些索引之间的子串,*然后*得到大写字母,那么维护会更容易。即使你的正则表达式工作正常,你也无法在几个月内理解这个正则表达式。 – Amy
您的字符串可以有多组圆括号吗?是否有错误的情况下有不匹配的括号?或者,总是只有两个你必须处理和没有错误条件? – Highdown