2017-12-27 1060 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

相關問題