2015-11-13 46 views
1

我有一個模式。每當特定匹配組不存在時,即使跳過下一個匹配組,它也會跳過並找到另一個匹配組。preg_match_all的條件正則表達式模式PHP

有4個捕獲組。

第一組,第二組,第三組,第四組

第三組是不是永遠存在的。在我的示例字符串中,有3組。第一個不包含第三組的任何字符。我想爲第三組提供一個條件語句。如果它沒有找到任何字符,那麼它應該捕獲空白或空間。

演示:https://regex101.com/r/zK0aW4/1

它應該是這樣的:https://regex101.com/r/sD4eB7/1

,但我不知道如何爲這種分配條件。

如果第三場比賽不存在,那麼它應該變成空白。我如何以正則表達式模式寫這個?

例如:

$string = "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000"; 

preg_match_all(
    "/([A-Z ,\.\-\&#\\\\n\/0-9&]+)(\d{10})([A-Z a-z]+)(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4})/", 
    $string, 
    $matches 
); 

這應該輸出類似:

array(3) { 
    [0]=> 
    array(3) { 
    [0]=> 
    string(78) "\nTHIS IS FIRST PATTERN 63101 0789158126 0-0000000-000-0000" 
    [1]=> 
    string(84) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n0406842931 Third match 0-0000000-000-0000" 
    [2]=> 
    string(87) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n0112853789 Third match 0-0000000-000-0000" 
    } 
    [1]=> 
    array(5) { 
    [0]=> 
    string(36) "\nTHIS IS FIRST PATTERN 63101" 
    [1]=> 
    string(42) "\n4415 THIS IS FIRST \nPATTERN 49401-9528\n" 
    [2]=> 
    string(45) "\n11403 THIS IS FIRST PATTERN 49401-\n9595\n" 
    } 
    [2]=> 
    array(3) { 
    [0]=> 
    string(10) "0789158126" 
    [1]=> 
    string(10) "0406842931" 
    [2]=> 
    string(10) "0112853789" 
    } 
    [3]=> 
    array(3) { 
    [0]=> 
    string(15) " " 
    [1]=> 
    string(15) " Third match " 
    [2]=> 
    string(15) " Third match " 
    } 
    [4]=> 
    array(3) { 
    [0]=> 
    string(17) "0-0000000-000-0000" 
    [1]=> 
    string(17) "0-0000000-000-0000" 
    [2]=> 
    string(17) "0-0000000-000-0000" 
    } 
} 
+0

使第一個量詞非貪婪:'+'=>'+?'。爲了更高效的模式,你也可以這樣寫:https://regex101.com/r/zJ9rP2/1 –

+0

這個字符類中的'&'允許每個字符,而不是實體。例如'&','a','m','p'和';'。 – chris85

+0

您將需要提供更多的樣本輸入,預期匹配,並更清楚地告訴我們現在有什麼問題。 – miken32

回答

0

試試這個:https://regex101.com/r/zK0aW4/2

((?:[A-Z ,.&#\/0-9-]|&|\\n)+?)(\d{10})([A-Z a-z]+)?(\d{1}-\d{7}-\d{3}-\d{4}|\d{1}-\d{7}-\d{2}-\d{4}) 

因爲您最初的小組有這麼多的比賽爲時已延長遠。通過更改爲非貪婪或懶惰匹配(*?+?),它將盡可能少地匹配。這使它在下列模式下表現更好。

字符類(由[]包圍)用於匹配單個字符;我假設你只想匹配一個文字&\n,所以把它們移出了角色類。

+0

謝謝!這是我正在尋找的!我是新的正則表達式模式。也感謝您的信息。 – oyan11