2017-04-06 74 views
0

我想從matlab文件中讀取幾條文本行。使用正則表達式函數來提取一些命名的標記。雖然一切工作都很好,但我不能在Matlab中獲得相同的表達式。Matlab正則表達式用命名標記捕獲組

有各種不同的線,我想處理,如:

line1 = 'attr enabled True'; 
line2 = 'attr width 1.2'; 
line3 = 'attr size 8Byte'; 

正則表達式我想出了模樣:

pattern = '^attr +(?<name>\S+) +(?:(?<number>[+-]?\d+(?:\.\d+)?)(?<unit>[a-z,A-z]*)?|(?<bool>(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE])))$' 

當我運行(在Matlab 2016B) :

[tokens, matches] = regexp(line1, pattern, 'names', 'match'); 

結果是這樣的:

tokens = 0×0 empty struct array with fields: 
      name 
matches = 0×0 empty cell array 

在八度的結果,但是,看起來像:

tokens = scalar structure containing the fields: 
      name = enabled 
      number = 
      unit = 
      bool = True 
matches = { [1,1] = attr enabled True } 

我測試了我的正則表達式與regexr.com這表明,倍頻爲正常工作。

當我從正則表達式去除外側拍攝組:

pattern = '^attr +(?<name>\S+) +(?<number>[+-]?\d+(?:\.\d+)?)(?<unit>[a-z,A-z]*)?|(?<bool>(?:[tT][rR][uU][eE]|[fF][aA][lL][sS][eE]))$' 

Matlab的輸出:

tokens = struct with fields: 
       bool: 'True' 
       name: [] 
       number: [] 
       unit: [] 
matches = { True } 

所以MATLAB開始認識到其他命名令牌的領域,但仍名字字段爲空。此外正則表達式不再是正確的交替... 這是一個關於捕獲組的錯誤還是我對某些東西產生了極大的誤解?

回答

0

一些簡單的測試表明MATLAB不支持命名參數的嵌套非捕獲組。你最好的解決辦法可能是使用未命名的組?

x1 = 'Apple Banana Cat'; 

% Named groups work: 
re1 = regexp(x1, '(?<first>A.+) (?<second>B.+) (?<third>C.+)', 'names') 

% Non-capturing (unnamed) groups work... 
re2 = regexp(x1, '(?:A.+) (?<second>B.+) (?<third>C.+)', 'names') 

% Nested non-capturing group does work, but not with named groups 
re3 = regexp(x1, '(?:(A.+)) (?<second>B.+) (?<third>C.+)', 'names')   % OK 
re4 = regexp(x1, '(?:(A.+)) (B.+) (C.+)', 'tokens')       % OK (unnamed) 
re5 = regexp(x1, '(?:(?<first>A.+)) (?<second>B.+) (?<third>C.+)', 'names') % Not OK 

可悲的是,沒有單一的規範正則表達式定義,有很多風味。所以只是因爲它可以與Octave或regexr.com協同工作,並不能保證它能夠或應該在別處工作,特別是當你開始進入更正式的正則表達式的區域時。

我想你可能需要解決它,但我很樂意被證明是錯誤的!

(PS我在v2016a測試,YMMV)。

編輯: 我現在已經在這兩個2016a測試和2016B「RE4」的作品,並給出了兩個相同的結果:你給

>> x1 = 'Apple Banana Cat'; 
>> re4 = regexp(x1, '(?:(A.+)) (B.+) (C.+)', 'tokens'); 

>> disp(re4{1}{1}) 
Banana 

>> disp(re4{1}{2}) 
Cat 
+0

我已經嘗試了第四示例(RE4)和我的結果是我沒有得到非捕獲組的'Apple'標記'(?:(A. +))'。所以即使使用未命名的令牌在Matlab 2016b中也失敗了。這個例子是否真的對你有用(或者說matlab版本之間有區別(迴歸?至少不相關的正則表達式更改應用在matlab 2016b中))? –

+0

我現在已經更新到Matlab 2017a,並且一旦涉及非捕獲組,無論是未命名的令牌還是已命名的令牌都可以工作。(相同的結果,例如(re4)) –

+0

我已經嘗試過re4 2016b和2016a和他們都給出了相同的結果,我會編輯我的答案爲清晰: – Justin