2015-03-23 15 views
21

Czy ktoś może wyjaśnić, co robi MATLAB z zerowymi bajtami (x00) w wyrażeniach regularnych?nul bajtów w regexp MATLAB

Przykłady:

>> regexp(char([0 0 0 0 0 0 0 1 0 0 10 0 0 0]),char([0 0 0 0 46 0 0 10])) 
ans = 
     1 % current 
     4 % expected 

>> regexp(char([0 0 0 1 0 0 0 1 0 0 10 0 0 0]),char([1 0 0 0 46 0 0 10])) 
ans = 
     4 % current 
     4 % expected 

>> regexp(char([0 0 0 1 0 0 0 1 0 0 10 0 0 0]),char([0 0 0 0 46 0 0 10])) 
ans = 
     [] % current 
     [] % expected 

>> regexp(char([0 0 0 0 10 0 0 1 0 0 10 0 0 0]),char([0 0 0 0 46 0 0 10])) 
ans = 
     1 % current 
     [] % expected 

>> regexp(char([0 0 0 0 0 0 0 1 0 0 10 0 0 0]),char([1 0 0 0 46 0 0 10])) 
ans = 
     [] % current 
     [] % expected 

Odpowiedź może być po prostu, MATLAB wyrażenie regularne nie jest przeznaczona do obsługi znaki spoza druku, ale zakładam, że to błąd, jeśli to był przypadek.

EDYCJA: Oczekuje się, że liczba 46 będzie równa '.', podobnie jak w przypadku symbolu wieloznacznego regex.

EDIT2:

>> regexp(char([0 0 0 0 50 0 0 100 0 0 90 0 0 0]),char([0 0 46 0 0 90])) 
ans = 
    1 9 

uświadomiłem sobie, że mogło być 10 jest znakiem specjalnym więc ten jeden ma tylko druku i nul bajtów. Spodziewam się, że ten będzie pasował tylko do 9, ponieważ piąty znak 50 nie pasuje do 0.

+0

Dlaczego oczekiwać pierwszy przykład, aby zwrócić '4' i twój czwarty przykład, aby zwrócić' [] '? Wydaje mi się, że mają dla mnie sens. W pierwszym przypadku wzór "NUL NUL NUL NUL. NUL NUL "będzie pasować do" NUL NUL NUL NUL NUL NUL NUL NUL "na początku łańcucha. – eigenchris

+0

@eigenchris Myślę, że pasowałoby tylko do 4, ponieważ 10 na końcu wzoru nie powinno pasować do 1 w obu przypadkach, prawda? – horriblyUnpythonic

+0

Masz rację. Znak nowej linii nie zachowywał się tak, jak się spodziewałem. Do tej pory to też mnie zaskoczyło. – eigenchris

Odpowiedz

1

ten błąd prawdopodobnie jest już naprawiony. I przetestowaniu przykład z Matlab Środkowej w kilku wersjach:

w R2013b:

>> regexp(char([0 0 1 0 41 41 41 41 41 41]),char([0 '.' 0 40 40 40 40]))  
ans = 

    2 

w R2015a:

>> regexp(char([0 0 1 0 41 41 41 41 41 41]),char([0 '.' 0 40 40 40 40])) 
ans = 

    2 

w R2016a:

>> regexp(char([0 0 1 0 41 41 41 41 41 41]),char([0 '.' 0 40 40 40 40])) 
ans = 

    []