2017-07-17 36 views
1

假設我們有一個名稱可以是myfilename_ABC(類型1)或myfilename_ABC=XYZ(類型2)的文件的集合。假設我們在任何時候提供regexp以及這兩種類型中只有一種的文件名數組,我如何獲得它返回一個數組爲1(對於類型1)或2(對於類型2)包含3字母組合?我已用Matlab正則表達式令牌 - 可選令牌和返回數組的大小

'myfilename_(\w+)=?(\w+)?'

嘗試,但此返回與2列的單元陣列即使對於1型的文件名,其中第二列包含空字符串''

+0

組數在模式中設置,您只能使用一些後處理來擺脫不需要的列。 –

+0

您可以使用''myfilename_ | =''[split](https://www.mathworks.com/help/matlab/ref/regexp.html#btqcpjk-4)並忽略第一個(空的)結果。 – Steve

回答

1

如果您只是爲每個案例創建匹配表達式並使用conditional operator,則可以這樣做。例如:

>> type1 = {'myfilename_ABC'; 'myfilename_DEF'}; 
>> type2 = {'myfilename_ABC=XYZ'; 'myfilename_DEF=UVW'}; 
>> matchExpr = 'myfilename_(\w+)=(\w+)|myfilename_(\w+)'; 
>> results1 = regexp(type1, matchExpr, 'tokens', 'once') 

results1 = 

    2×1 cell array 

    {1×1 cell} % Each cell contains 1-by-1 results 
    {1×1 cell} 

>> results2 = regexp(type2, matchExpr, 'tokens', 'once') 

results2 = 

    2×1 cell array 

    {1×2 cell} % Each cell contains 1-by-2 results 
    {1×2 cell} 

注意,我放置的時間越長匹配表達式(myfilename_(\w+)=(\w+)之前較短一個(myfilename_(\w+)),使得它會嘗試匹配較長的第一。我還使用了'once' option(爲了使每個輸入的表達式只匹配一次)到remove an extra layer of cell encapsulation

相關問題