PHP - preg_match - 匹配!单词,或匹配!单词后跟单词(s)

时间:2012-11-26 05:41:08

标签: php regex preg-match

我正在尝试找到一个正则表达式模式,以便将以下内容与模式匹配(不带引号):

“!comm” - 匹配,匹配(0)=!comm,match(1)= comm

“!comm param1 param2” - 匹配,匹配(0)=!comm param1 param2,match(1)= comm,match(2)= param1 param2

“!comm” - 不应该匹配

我开始如下:

$string1 = "!comm";
$string2 = "!comm param1 param2";
$string3 = "!comm ";

preg_match("`!(.*?)$`", $string1, $match1);
preg_match("`!(.*?)\s(.*)$`", $string2, $match2);
preg_match("`!(.*?)\S$`", $string3, $match3);

echo "<h1>Test 1</h1>";
echo "<pre>";
print_r($match1);
print_r($match2);
print_r($match3);
echo "</pre>";

这给出了我想要的确切输出,只是它们不是一般化的,只是作为个人工作:

Array
(
    [0] => !comm
    [1] => comm
)
Array
(
    [0] => !comm param1 param2
    [1] => comm
    [2] => param1 param2
)
Array
(
)

然后尝试将它们合并为:

`!(.+)($|\s(.*)$|\S$)`

但显然失败了,我知道我错了。虽然我没有把它们保存起来,但是我尝试了一些其他的东西,经过一段时间的谷歌搜索后,我大多是盲目拍摄。前瞻性方式,或者if / else方式,已经结束了“!comm param1 param2”和“!comm”匹配,或者只是每个都是个体。

我觉得这在RegEx中是可行的,但我在RegEx中仍然是新手,我觉得我的思维方式还没有找到它。因此,除了可以使用的全功能RegEx之外,我还希望逐步实现这一目标。

1 个答案:

答案 0 :(得分:1)

你可以将模式组合成:

`^!(\S+)(?:\s+(\S+.*))?+$`
  1. 以“!”开头
  2. “comm”应该是非空格字符。
  3. 然后没有任何内容或任何数量的空格和参数字符串