PHP / Javascript RegEx - 非捕获组

时间:2009-06-11 12:43:59

标签: regex

我有一个字符串的三种变体:

1. view=(edit:29,30)
2. view=(edit:29,30;)
3. view=(edit:29,30;x:100;y:200)

我需要一个RegExp:

  1. 捕获并包括“,30”
  2. 捕获“x:100; y:200” - 只要在第一场比赛后有分号;
  3. 不会在任何组中包含最左边的分号;
  4. 第一个分号右边的整个字符串,最多为')'可以/应该在同一个组中。
  5. 我想出了:

    $pat = '/view=\((\w+)(:)([\d,]+)((;[^)]+){0,}|;)\)/';
    

    应用于'view =(编辑:29,30; x:100; y:200)'它产生:

    Array
    (
        [0] => view=(edit:29,30;x:100;y:200)
        [1] => edit
        [2] => :
        [3] => 29,30
        [4] => ;x:100;y:200
        [5] => ;x:100;y:200
    )
    

    问题。如何删除';'来自比赛[4]和[5]?

    重要即可。当没有分号存在时,相同的RegExp应该使用字符串,如:'view =(edit:29,30)'。

    $pat = '/view=\((\w+)(:)([\d,]+)((;[^)]+){0,}|;)\)/';
    $str = 'view=(edit:29,30;x:100;y:200)';
    preg_match($pat, $str, $m);
    print_r($m);
    

    谢谢!

2 个答案:

答案 0 :(得分:4)

您无需对所有内容进行分组。试试这个正则表达式:

/view=\((\w+):([\d,]+)(?:;([^)]+)?)?\)/

答案 1 :(得分:0)

我猜你想要这样的东西:

$pattern = '/view=\\((\\w+):(\\d+,\\d+)(?:;((?:\\w+:\\d+;?)*))?\\)/';

应该返回

[0] view=(edit:29,30;x:100;y:200)
[1] edit
[2] 29,30
[3] x:100;y:200