如何使懒惰匹配正确匹配?

时间:2012-01-10 11:51:09

标签: regex

给定一个字符串(如下面的例子所示),我想将以下内容分为三组:

  1. 第1组:第一个字符是#还是
  2. 第2组:捕获#(如果存在)和方括号(如果[
  3. 之间的字符串
  4. 第3组:捕获方括号内容(不带方括号)
  5. 在这个阶段,我有以下正则表达式:

    /^(#)?(.*?)\[?(.*?)\]?$/
    

    我使用http://gskinner.com/RegExr/作为我的测试工具,打开了多行和全局。

    示例1:

    #Sprite[abc]
    

    预期结果

    1. 第1组:
    2. 第2组:精灵
    3. 第3组: abc
    4. 实际结果

      1. 第1组:
      2. 第2组: //清空,不是没有比赛
      3. 第3组:精灵[abc //无尾随]
      4. 示例2:

        #Sprite
        

        预期结果

        1. 第1组:
        2. 第2组:精灵
        3. 第3组: [不匹配]​​
        4. 实际结果

          1. 第1组:
          2. 第2组:
          3. 第3组:精灵
          4. 示例3:

            Sprite
            

            预期结果

            1. 第1组: [不匹配]​​
            2. 第2组:精灵
            3. 第3组: [不匹配]​​
            4. 实际结果

              1. 第1组: [不匹配]​​
              2. 第2组: //清空
              3. 第3组:精灵
              4. 示例4:

                Sprite[abc]
                

                预期结果

                1. 第1组: [不匹配]​​
                2. 第2组:精灵
                3. 第3组: abc
                4. 实际结果

                  1. 第1组: [不匹配]​​
                  2. 第2组: //清空
                  3. 第3组:精灵[abc
                  4. 对我来说,感觉就像上面表达式中的懒惰比赛并不是很懒惰,不应该击中[然后突破,分组并继续前进?

3 个答案:

答案 0 :(得分:2)

最好更具体而不是懒惰:)

(#)?([^\[]*)(?:\[([^\]]*)\])?$

适用于您的示例。翻译:

(\#)?       # Match # (optional)
([^\[]*)    # Match any characters except [
(?:         # Try to match...
 \[         #  [, followed by
 ([^\]]*)   #  any characters except ], followed by
 \]         #  ]
)?          # optionally
$           # Match end of string.

答案 1 :(得分:1)

我在python中成功使用了以下表达式:

regex = re.compile(r'^(#)?(.*?)(?:\[(.*?)\])?$')

问题基本上是括号后面的问号(?.*?之后使懒惰变得困难)。问号现在是整个表达式,即(?:\[(.*?)\])?

注意:(?:)用于避免捕获表达式(我不知道您使用的工具是否支持该表达式。)

答案 2 :(得分:0)

您可以尝试:

^(#)?([^\[]*)(?:\[(.*?)\])?$