2011-06-08 174 views
1

我想寫一個正則表達式,它產生的內容不在括號或括號中的字符串。括號總是一年,括號中可以包含任何普通字符,大寫和小寫。我正想它通過查找括號和括號,然後按[^ \正則表達式]逃脫它紅寶石正則表達式,一切,但括號和括號內是什麼

這裏的字符串(這是正確的?):

s = 'Some words (1999) [THINGS] 

和正則表達式:

/[^(\(\d{4}\))|\[.*\]]/ 

,但是這包括裏面的人物在括號中看到(http://rubular.com/r/bbpcnnGgCI)

一切正常,直到加入[^ \正則表達式]

例如,該工程獲得(1999年):

>> puts s.match(/\(\d{4}\)/) 
(1999) 

和什麼括號:

>> puts s.match(/\[.*\]/) 
[THINGS] 

,但把它們放在一起使用|爲「或」:

>> puts s.match(/\(\d{4}\)|\[.*\]/) 
(1999) 

...它只是匹配括號及其內容。

這是怎麼回事?

我在這裏做錯了什麼?

回答

5

試試這個/\(.+/這將匹配從開頭(開始的所有內容。如果你把它拿出來,你就剩下'Some words'這應該是你需要的嗎?

兩點

  1. 我可能誤解的問題
  2. 你需要的東西,如果有前面字符串中出現的(的可能性更加複雜。

順便說一句,我覺得this相當有價值試圖想出正則表達式模式時。即使在字符串中較早的一個流浪支架

編輯這種模式只應在括號匹配的東西。

string.gsub(/(\(|\[).+(\)|\])/, '') 
+0

@duckyfizz完美!和一個很好的資源。它與替換錯誤,但與gsub工作得很好。 – rick 2011-06-08 03:18:43

+0

對不起,我的意思是gsub。出於某種原因已經替換了我的頭。 – 2011-06-08 03:21:44

+0

即時通訊將不得不在這一點上工作,因爲我也有沒有括號或括號的字符串,並且當它在這些字符串上運行時,它會將其擦除(nil)。有任何想法嗎? – rick 2011-06-08 03:52:56

0

怎麼樣從相反的方向看這個:嘗試空白""更換模式\(\d{4}\),那麼你就會有你想要什麼:

s.gsub("\(\d{4}\)", "") 

編輯:要結合語法修正通過@建議rick(thx @rick!)

+0

是這樣的? http://rubular.com/r/mFSfx2wIez似乎給我的一切,但實際的括號和括號,我不想要他們的內容。 – rick 2011-06-08 03:07:02

+0

哦,我明白你在說什麼了。使用gsub即時通訊得到相同的結果,沒有任何改變,但我看到你要去哪裏... >> s.gsub(「\(\ d {4} \)」,「」) =>「藝術家的名字1999)[FLAC]「 – rick 2011-06-08 03:09:47

+0

@rick:請注意括號被轉義,即\(\ d {4} \) - 不是(\ d {4}),如您的評論 – Bohemian 2011-06-08 03:25:28

3

(\(\d{4}\))|\[.*\]意味着「括號包圍,還抓獲一組四位數字;或方括號內的任何內容「。

[^...]不是的意思是「任何與...不匹配的東西」。 []設置了一個字符集,如果它以^開頭則被否定。 「[^(\(\d{4}\))|\[.*\]]」的意思是「不是左括號或右括號或數字或開放括號或4或右括號或右括號或右括號或管道或開放方括號或句號或字符的字符星號或近方括號「。

您希望匹配「不在括號或括號內的任何文本」。這不容易直接表達爲正則表達式。你真正想要做的是將「任何括號或括號內的項目」作爲分隔符來分割字符串。

我不知道的Ruby語法,但在Python這個樣子:

import re 

pattern = re.compile(r"(?:\[[^\]]*\])|(?:\(\d{4}*\))") 

pattern.split('Some words (1999) [THINGS]') # ['Some words ', ' ', ''] 

這使你的各個部分,假設你需要他們。如果你只是想再次聯合起來,那麼「用空字符串替換分隔符」(即gsub)的方法工作得很好。

+0

我明白你在說什麼。因爲沒有明確的「匹配所有東西但是這個」,而是將其分開,然後明確調用數組的元素。非常有意義。感謝你打破了正則表達式,我覺得它越來越長,我開始失去了我在做什麼的意義:) – rick 2011-06-08 03:51:39

+0

你可能會發現它有助於編寫粘合正則表達式的函數。例如(在Python中):'def regex_any(* x):return'(%s)'%'|'.join(x)'。或者使用/ x正則表達式標誌。 – 2011-06-08 03:53:32

+0

即時開始看到/ x標誌可能會幫助我們新regrex的。謝謝! – rick 2011-06-08 04:19:41

相關問題