正则表达式只匹配捕获组的项目一次

时间:2017-10-16 08:42:23

标签: regex

所以我试图在几个选项中拆分一个字符串,但这些选项只允许发生一次。我已经弄清楚如何使它匹配所有选项,但是当一个选项出现两次或更多时,它匹配每个选项。

示例字符串:--split1 testsplit 1 --split2 test split 2 --split3 t e s t split 3 --split1 split1 again

正则表达式:/-{1,2}(split1|split2|split3) [\w|\s]+/g

现在它匹配所有情况,我希望它只匹配--split1--split2--split3一次(因此--split1 split1 again将不匹配)。

我可能错过了一些非常直接的事情,但有人愿意帮忙吗? :)

修改

决定处理脚本中出现的额外事件,而不是通过RegEx,更容易处理错误。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

编辑:我不知何故从PHP部分到此处,因此PHP代码。但是,相同的原则适用于任何其他语言。

我意识到OP已经表示他们已经找到了解决方案,但我将此放在未来的访客中。

function splitter(string $str, int $splits, $split = "--split")
{
    $a = array();
    for ($i = $splits; $i > 0; $i--) {
        if (strpos($str, "$split{$i} ") !== false) {
            $a[] = substr($str, strpos($str, "$split{$i} ") + strlen("$split{$i} "));
            $str = substr($str, 0, strpos($str, "$split{$i} "));
        }
    }

    return array_reverse($a);
}

此函数将分割字符串,以及将分割的段数。像这样使用它:

$array = splitter($str, 3);

它会成功地围绕$split参数爆炸数组 参数使用如下:

  • $str
    要拆分的字符串。在您的实例中,它是:--split1 testsplit 1 --split2 test split 2 --split3 t e s t split 3 --split1 split1 again
  • $splits
    这是您要创建的数组的元素数量。在您的实例中,有3个不同的分裂 如果未找到拆分,则将跳过该拆分。例如,如果您有--split1--split3但没有--split2,那么该数组将只拆分两次。
  • $split
    这是将成为数组分隔符的字符串。请注意,它必须与问题中指定的一样。这意味着,如果您要使用--myNewSplit进行拆分,则会将该字符串附加一个从1到$splits的数字。

所有元素都以空格结尾,因为函数会查找$split,并且每次拆分前都有一个空格。如果您不想拥有尾随空格,则可以将代码更改为:

$a[] = trim(substr($str, strpos($str, "$split{$i} ") + strlen("$split{$i} ")));

另外,请注意strpos在分隔符后面查找空格。同样,如果您不想要空格,请将其从字符串中删除。

我使用某个功能的原因是,如果您决定要进行四次拆分或更改分隔符,它将在未来为您提供灵活性。

显然,如果您不再需要数字更改分隔符,则explode function就可以用于此目的。

答案 1 :(得分:-1)

-{1,2}((split1)|(split2)|(split3)) [\w|\s]+

这样的东西?在这种情况下,这将创建3个数组,其中所有数组都具有相同名称的元素数组。希望这有帮助