2012-11-26 107 views
1

我試圖找到一個正則表達式來匹配模式下(沒有他們的引號):PHP - 的preg_match - 匹配一個單詞,或匹配字,接着字(S)

「!! (0)=!通訊,匹配(1)=通訊

「!comm param1 param2」 - 匹配,匹配(0)=!通訊參數1參數2,匹配(1)=通訊,匹配(2)=參數1參數2

「!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$)` 

但顯然失敗了,我知道我在想錯。我嘗試了一些其他的方法,儘管我沒有把它們保存起來,但在Google搜索一段時間之後,我大部分都是盲目的拍攝。預見性的方式,或者如果/其他方式,或者已經結束了「!comm param1 param2」和「!comm」匹配或者僅僅作爲單獨的匹配。

我確實認爲這在RegEx中是可行的,但我在RegEx中仍然太新了,我覺得我的思維方式還沒有找到它的位置。因此,除了全功能的RegEx準備好使用之外,我希望通過一步一步的流程來實現這一目標。

+0

你可能要考慮使用RegexBuddy - 有用的編寫更復雜的正則表達式。 – Eli

+0

@Eli謝謝。然而,雖然它看起來很有用,而且我一直聽到這個消息,但我寧願選擇一個免費軟件解決方案,因爲我目前無法負擔得起,而且我只是以非商業的方式嘗試RegEx。 – TheDeadLike

回答

1

可以將圖案組合成這樣:

`^!(\S+)(?:\s+(\S+.*))?+$` 
  1. 開始以 「!」
  2. 「comm」應該是非空格字符。
  3. 然後後面什麼都沒有或者空格任何數字和param串
+0

首先,謝謝你,它完美的作品,我試圖理解它。我們將命令字作爲任何東西而不是空格進行匹配,重複{0,}次,當沒有字符時,匹配不會發生,這似乎也忽略了空匹配(?)。然後在被動羣體中(再次感謝,因爲我也知道這一點!),[後面跟着一個空格(我將這部分從\ s +更改爲\ s,因爲只有單個空間是我需要的),然後是任何東西],或[沒有任何東西]。我實際上沒有得到的是「+」部分。既然我們已經開始貪婪(\ S. *)部分,是不是?/ {0,1}我們需要的全部? – TheDeadLike

+0

噢,是的,「一次或全部都不是我們所需要的」。沒有必要使用這種佔有量詞,儘管它在這種情況下起作用。 – Kleenestar