如何使用REGEX匹配捕获多个模式? (红宝石)

时间:2011-04-10 11:48:55

标签: ruby-on-rails ruby regex

这是我尝试使用ruby捕获的测试字符串:

<?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所示。

如何在不捕获我不想要的内容的情况下正确捕获两个不同的块?

2 个答案:

答案 0 :(得分:4)

You want to use a lazy quantifier

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

?量词之后添加*意味着它会使 lazy 。这意味着它不会尝试使用尽可能多的字符来进行匹配( greedy ),而是使用最小值来满足表达式。

答案 1 :(得分:1)

您可以使用多线模式使其更简单。您也不需要外括号,因为它与整个匹配相同,您可以通过$~获得。如果你想捕捉<?lang ?>内的内容,那么你可以在那里加上括号。

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

PS。

  • 当交替模式是单个字符时,您可以使用[ ]而不是括号( )。例如,[\n.]
  • 即使你需要使用括号来显示替换,你也应该使用非捕获的paretheses (?: ),除非你需要引用内容,因为这会比使用捕获括号更快{{1} }。例如,( )