【问题标题】:How do I match capture multiple patterns using REGEX? (Ruby)如何使用 REGEX 匹配捕获多个模式? (红宝石)
【发布时间】:2011-04-10 11:48:54
【问题描述】:

这是我尝试使用 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 所示。

如何正确捕获两个不同的块而不捕获我不想要的?

【问题讨论】:

    标签: ruby-on-rails ruby regex


    【解决方案1】:

    You want to use a lazy quantifier.

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

    * 量词之后添加? 意味着它会使其惰性。这意味着与其尝试使用尽可能多的字符来进行匹配(greedy),不如使用最少的字符来满足表达式。

    【讨论】:

    • 完美!你太棒了。非常感谢亚历克斯 :)
    【解决方案2】:

    您可以使用多行模式使其更简单。您也不需要外括号,因为这与整个匹配项相同,您可以通过$~ 获得。如果你想捕捉&lt;?lang ?&gt;里面的内容,那么你可以把括号放在那里。

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

    PS。

    • 当交替模式为单个字符时,您可以使用[ ] 代替括号( )。例如,[\n.]
    • 即使您需要使用括号来显示交替,您也应该使用非捕获括号(?: ),除非您需要引用内容,因为这样比使用捕获括号( ) 更快。例如,(?:\n|.)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      相关资源
      最近更新 更多