2011-10-24 39 views
0

我有一個這樣的字符串之間的字符:往裏模式如果父模式匹配和共享模式

門票順序:№123123123. CED-MSW-RPG-MOW-CEK PODYLOVA/ALEMR 555 423578932 19OCT11門票順序:№123123123. 346257. CSK-MOW-PRG-MOW-CWQ PODYLOVA/ALEMR 555 45837043 19OCT11

我需要收集是CEK所有代碼,外嫁女,PRG等。我首先嚐試這種模式:

$pattern = '#[-|\s]([A-Z]{3})#'; 

作爲一個結果讓我的所有代碼(這是確定)和用戶的第一個3個字符姓:「POD」從「PODYLOVA」。如果我說:「以後我的代碼必須是一個連字符或可用空間字符改變我的模式是:

$pattern = '#[-|\s]([A-Z]{3})[-|\s]#'; 

我$相匹配的VAR有這樣的:

array (
    0 => 
    array (
    0 => ' CED-', 
    1 => '-RPG-', 
    2 => '-CEK ', 
    3 => ' CSK-', 
    4 => '-PRG-', 
    5 => '-CWQ ', 
), 
    1 => 
    array (
    0 => 'CED', 
    1 => 'RPG', 
    2 => 'CEK', 
    3 => 'CSK', 
    4 => 'PRG', 
    5 => 'CWQ', 
), 
) 

你可以看到,我的模式沒有「共享」所需的代碼之間的連字符

我看到兩個解決方案,但不能成像模式,將適合:

  1. 使圖案在代碼之間分享連字符
  2. 製作更復雜的圖案:首先收集包含代碼的文本(「CED-MSW-RPG-MOW-CEK」),然後獲取所有#([AZ] {3} #在這個模式裏面。

看來,解決方案#1是最好的在我的情況,但它應該看起來如何?

回答

1

試試這個:

\b([A-Z]{3})\b

HTH

+0

你甚至不需要括號。你可能想給@the_ghost一個提示,說明'\ b'是[word邊界](http://www.regular-expressions.info/wordboundaries.html)。 –

+0

謝謝!我只是走過這個模式,甚至嘗試過\ b,但並不認爲一切都那麼簡單 –

0

這是否給你你想要的?

(?<=-|\s)[A-Z]{3}(?=-|\s) 

測試使用grep:

kent$ echo "Tickets order: № 123123123. CED-MSW-RPG-MOW-CEK PODYLOVA/ALEMR 555 423578932 19OCT11 Tickets order: № 123123123. 346257. CSK-MOW-PRG-MOW-CWQ PODYLOVA/ALEMR 555 45837043 19OCT11"|grep -Po '(?<=-|\s)[A-Z]{3}(?=-|\s)' 
CED 
MSW 
RPG 
MOW 
CEK 
CSK 
MOW 
PRG 
MOW 
CWQ 
+0

貴變種使用嵌套組,因爲我問? –