我試圖獲取字符串中最後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