这是我尝试使用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所示。
如何在不捕获我不想要的内容的情况下正确捕获两个不同的块?
答案 0 :(得分:4)
You want to use a lazy quantifier
(<\?lang(\n|.)*?\?>)
在?
量词之后添加*
意味着它会使 lazy 。这意味着它不会尝试使用尽可能多的字符来进行匹配( greedy ),而是使用最小值来满足表达式。
答案 1 :(得分:1)
您可以使用多线模式使其更简单。您也不需要外括号,因为它与整个匹配相同,您可以通过$~
获得。如果你想捕捉<?lang ?>
内的内容,那么你可以在那里加上括号。
/<\?lang(.*?)\?>/m
PS。
[ ]
而不是括号( )
。例如,[\n.]
(?: )
,除非你需要引用内容,因为这会比使用捕获括号更快{{1} }。例如,( )