2015-05-12 32 views
1

我有一個字符串裏面有字符,我只想匹配字符串周圍的字符。正則表達式匹配文字的字符

"This is a [1]test[/1] string. And [2]test[/2]" 

Rubular http://rubular.com/r/f2Xwe3zPzo

目前,在鏈接代碼中的特殊字符中的文本相匹配,我該怎麼改變呢?

更新

澄清我的問題。只有開幕式和閉幕式的號碼相同時,它才應該匹配。

"[2]first[/2] [1]second[/2]" 

在上面的代碼中,只有第一個應該匹配而不是第二個。特殊字符(第一個)內的文本應該被忽略。

回答

3

試試這個:

(\[[0-9]\]).+?(\[\/[0-9]\]) 

Permalink對Rubular的例子。

更新

既然你要刪除的 '特殊' 人物,試試這個來代替:

foo = "This is a [1]test[/1] string. And [2]test[/2]" 
foo.gsub /\[\/?\d\]/, "" 
# => "This is a test string. And test" 

更新,第二部分

你只是想去掉了「特殊'字符時,周圍的標籤匹配,所以這個怎麼樣:

foo = "This is a [1]test[/1] string. And [2]test[/2], but not [3]test[/2]" 
foo.gsub /(?:\[(?<number>\d)\])(?<content>.+?)(?:\[\/\k<number>\])/, '\k<content>' 
# => "This is a test string. And test, but not [3]test[/2]" 
+0

OK啊, 我明白。不幸的是,gsub方法也刪除了特殊字符中的文本。 'a =「這是一個[1]測試[/ 1]字符串。[2]測試[/ 2]」' 'a.gsub /([[0-9]\]).++?(\ [\/[0-9] \])/,''' '=>「這是一個字符串,並且'' – nazshal

+0

好的,您想刪除這些'特殊'字符? – newmediafreak

+0

Sry,是的,我想刪除特殊字符。我知道如何處理gsub,我對這個正則表達式毫無頭緒。 – nazshal

1

\[([0-9])\].+?\[\/\1\]

([0-9])是捕獲,因爲它用括號括起來。該\1告訴它使用該捕獲的結果。如果你有一個以上的拍攝,你可以參考它們爲好,\2\3

Rubular


你也可以使用一個named capture,而不是\1讓它少一點神祕。如下:\[(?<number>[0-9])\].+?\[\/\k<number>\]

+0

Thx爲鏈接! – nazshal

0

這是一種使用String#gsub形式的塊的方法。我們的想法是將諸如"[1]test[/1]"之類的字符串放入塊中,然後刪除不需要的位。

str = "This is a [1]test[/1] string. And [2]test[/2], plus [3]test[/99]" 

r =/
    \[ # match a left bracket 
    (\d+) # capture one or more digits in capture group 1 
    \] # match a right bracket 
    .+? # match one or more characters lazily 
    \[\/ # match a left bracket and forward slash 
    \1 # match the contents of capture group 1 
    \] # match a right bracket 
    /x 

str.gsub(r) { |s| s[/(?<=\]).*?(?=\[)/] } 
    #=> "This is a test string. And test, plus [3]test[/99]" 

題外話:當我第一次聽到命名捕獲羣體,他們似乎是一個好主意,但現在我不知道他們是否真的能讓正則表達式更容易比\1閱讀,\2 ....