2011-04-10 54 views
0

這裏是我試圖捕捉使用Ruby我的測試字符串:如何使用REGEX匹配捕獲多個模式? (紅寶石)

<?lang 
    this_should_be_captured(); 
    and_also_this(); 
    and_this(); 
?> 

this text should NOT be captured 

<?lang this_should_also_be_captured(); ?> 

當我使用正則表達式:

(<\?lang(\n|.)*\?>) 

匹配捕捉一切(包括一部分我不想要:「不應該捕獲該文本」),如http://rubular.com/r/qSOOzq6HAx所示。

我怎樣才能正確地捕捉到兩個不同的塊,而不捕捉我不想要什麼?

回答

4

You want to use a lazy quantifier

(<\?lang(\n|.)*?\?>) 

添加後?*量詞意味着它將使。這意味着它不會嘗試消耗盡可能多的字符來進行匹配(貪婪),它將消耗最小值來滿足表達式。

+0

完美!你太棒了。非常感謝Alex :) – sjsc 2011-04-10 11:55:15

+0

@sjsc謝謝! – alex 2011-04-10 11:55:38

1

通過使用多行模式,可以使其更簡單。您也不需要使用外部圓括號,因爲它與整個匹配相同,您可以通過$~得到。如果你想捕捉<?lang ?>裏面的內容,那麼你可以在那裏放置圓括號。

/<\?lang(.*?)\?>/m 

PS。

  • 當交替模式是單個字符,您可以使用[ ]代替括號( )的。例如,[\n.]
  • 即使當你需要使用括號來表示交替,你應該使用非捕獲paretheses (?: )除非你需要參考的內容,因爲這將使它比使用捕捉更快括號( )。例如,(?:\n|.)