2012-09-05 158 views
1

我試圖捕捉字符串這樣大膽部分:正則表達式嵌套可選組

  1. 「捕捉在字符串的結尾年份範圍1995-2010

  2. '如果沒有年份範圍只是捕獲單一年份'

  3. '捕獲年份/年份範圍一個括號,包括括號2007-2012(58個月)'

此正則表達式適用於1和2,但我不能讓它爲3工作:

/(\d+([-–— ]\d+(\(\d+ months\))?)?$)/ 

我做錯了什麼?

+0

您的字符串是否總是包含在'''中?我的意思是,是否是字符串的一部分? – Aust

+0

你正在使用什麼特定的正則表達式工具? – Glenn

+0

@如果'''不是字符串的一部分。 @Glenn我在javascript'.replace()'的上下文中使用它。 – supertrue

回答

2

試試這個正則表達式:括號

/\d{4}(?:[-–— ]\d{4})?(?:\s*\([^)]+\))?$/gm 

這一次抓住了一切。 如果您需要在括號中的正則表達式的具體文本「(數量)個月」,那麼你可以使用這個:\d{4}(?:[-–— ]\d{4})?(?:\s+\(\d+\smonths\))?$

鏈接測試:RegexPalRegExr

示例文本:

  • 在一個字符串的結尾處捕捉一年的範圍1995-2010
  • 如果沒有年份範圍只是捕捉單個年份2005
  • 捕獲一年/年範圍後跟一個括號,包括 括號2007-2012(58個月)
  • 嘗試另一個例子1990年(23周)
  • 嘗試另一個例子1995-2002(x天)
  • 嘗試另一個例如2050(等等等等)
  • 嘗試另一個例子2050-3000
  • 嘗試另一個例子2050-3000
  • 嘗試另一個例子2050-3000

和JavaScript代碼:

var regex = /\d{4}(?:[-–— ]\d{4})?(?:\s*\([^)]+\))?$/gm; //multiline enabled 
var input = "your input string"; 
if(regex.test(input)) { 
    var matches = input.match(regex); 
    for(var match in matches) { 
    alert(matches[match]); 
    } 
} else { 
    alert("No matches found!"); 
} 
+0

感謝您的回答和解釋。這就是我喜歡SO的原因。 – supertrue

2

這個正則表達式很好用。 :)

/(?:(?:\d{4}[-–— ])?\d{4})(?: \(\d+ months\))?$/ 

我正則表達式和約拿之間的主要區別是,我的包含?:這意味着未捕獲子組。當你在正則表達式中分組時,它會自動返回該組中的內容,除非你不告訴它,並且我發現有時當使用諸如replacesplit的方法捕獲這些組時,它可能是一個小錯誤,也可能是你的問題。

+0

這一個似乎不匹配1和2. – Kash

+0

@卡什 - 感謝哈哈它現在的作品。當我複製它時,我錯誤地輸入了最後一個「?」 – Aust

+0

謝謝,這也適用 - 希望我可以選擇多個答案。 – supertrue

1

以下正則表達式適用於示例Perl腳本。它應該在JavaScript中是可行的:

/(\d{4}([-–— ]\d{4})?(\(\d+ months\))?)$/ 
  1. 我們首先一個4位數的年份匹配:\d{4}
  2. 然後我們匹配一個可選的分隔符,然後另外4位數字的年份:([-–— ]\d{4})?
  3. 最後,我們配合可選的幾個月部分:(\(\d+ months\))?

您可能需要插入空白匹配(\s*)在需要的地方,如果你的數據不ALW ays遵循這個嚴格的模板。

+0

年份範圍可以有以下分隔符之一:[---]由OP的正則表達式提供。這個不包括那個。 – Kash

+0

糟糕...你是對的!我會修改它... –

0

如果我正確理解你的需求,它實際上可以正常工作:Gskinner RegExr 只是替換最後一個句子,因爲$不會計入換行符,只是字符串的末尾。