2010-04-28 32 views
1

我工作2例部分匹配一個Ruby字符串:方式使用正則表達式

假設我有那些變種:

a = "hello" 
b = "hello-SP" 
c = "not_hello" 
  1. 任何部分匹配
    我想接受任何字符串裏面有變量a,所以bc會匹配。

  2. 帶圖案匹配
    我想匹配了a內的字符串,然後'-',所以b將匹配,c沒有。

我有問題,因爲我一直使用的語法/expression/定義的正則表達式,所以如何動態地對Ruby的定義正則表達式?

回答

6

您可以使用相同的語法的正則表達式使用變量,所以:

reg1 = /#{a}/ 

會匹配任何包含a變量的值(當時的表達是創建!)和

reg2 = /#{a}-/ 

會做同樣的事,再加上一個連字符,所以hello-在你的例子中。

編輯:韋恩·康拉德指出,如果a包含「將在正則表達式特殊含義的任何字符,」你需要躲避他們的。例如:

a = ".com" 
b = Regexp.new(Regexp.escape(a)) 
"blah.com" =~ b 
+2

另一種選擇是使用Regexp.new,即'REG2 = Regexp.new( 「#{A} - 」)'。 – 2010-04-28 18:11:19

+0

@格雷姆坎貝爾,是的,但這是更多的字母:) – 2010-04-28 18:56:54

+1

如果'a'可能有任何正則表達式元字符(週期,明星等),然後將其包裝在'Regexp.escape'的調用中。 – 2010-04-29 13:51:06

0

晚發表評論,但我沒能找到我一直在尋找答案,提到上面for.The沒有幫助me.Hope它幫助別人新的紅寶石誰只是想速戰速決。

紅寶石代碼:

st = "BJ's Restaurant & Brewery" 
    #take the string you want to match into a variable 
    m = (/BJ\'s/i).match(string) #(/"your regular expression"/.match(string)) 
    # m has the match #<MatchData "BJ's"> 
    m.to_s 
    # this will display the match 
=> "BJ's"