Проверка, соответствует ли пустая строка регулярному выражению в Matlab - PullRequest
0 голосов
/ 05 сентября 2018

Я знаю, что функцию Matlab regexp я должен использовать для поиска соответствия между строкой и регулярным выражением.

Однако, когда пустая строка соответствует регулярному выражению, она показывает тот же результат, что и когда она не соответствует:

expr1 = 'b'
regexp('a', expr1, 'match') % Returns empty cell: no match
regexp('b', expr1, 'match') % Returns cell with 'b'
regexp('', expr1, 'match')  % Returns empty cell: no match

expr2 = ''
regexp('a', expr2, 'match') % Returns empty cell: no match
regexp('', expr2, 'match')  % Returns empty cell: but it matches

expr3 = 'b?'
regexp('a', expr3, 'match') % Returns empty cell: no match
regexp('b', expr3, 'match') % Returns cell with 'b'
regexp('', expr3, 'match')  % Returns empty cell: but it matches

expr4 = '|b'
regexp('a', expr4, 'match') % Returns empty cell: no match
regexp('b', expr4, 'match') % Returns cell with 'b'
regexp('', expr4, 'match')  % Returns empty cell: but it matches

expr5 = '.*'
regexp('b', expr5, 'match') % Returns cell with 'b'
regexp('', expr5, 'match')  % Returns empty cell: but it matches

Когда результатом является пустая ячейка, я не могу провести различие между «нет совпадения между строкой и регулярным выражением» и «соответствует строка, но это просто пустая строка».

Как я могу различить эти два случая?

Другим способом сделать то, что я хочу, было бы наличие функции, которая проверяет, совпадает ли (возможно, пустая) строка (не ее подстроки) с регулярным выражением, но я не смог найти ее в Matlab.

РЕДАКТИРОВАТЬ : я работаю с Matlab2015a, и я попытался заменить '' на blanks(0), но это дает те же результаты.

1 Ответ

0 голосов
/ 05 сентября 2018

Я не уверен, почему вам может понадобиться это сделать, но есть способ различать ваши условия "нет совпадения" и "совпадение пустой строки" для каждого случая, кроме вашего четвертого выражения совпадения '|b'. Похоже, что это выражение пытается сопоставить «ничто или 'b'», которое, я думаю, ничем не отличается от вашего предыдущего выражения 'b?', которое «'b' 0 раз или 1 раз».

Если вы добавите начальный и конечный якоря к своему выражению соответствия и используете опцию 'emptymatch' для regexp, то вы получите пустое ячейка {} для несоответствий и ячейка, содержащая пустую строку {''} для совпадений с пустой строкой:

expr1 = '^b$';
regexp('a', expr1, 'match', 'emptymatch')   % Result = {}
regexp('b', expr1, 'match', 'emptymatch')   % Result = {'b'}
regexp('', expr1, 'match', 'emptymatch')    % Result = {}

expr2 = '^$';
regexp('a', expr2, 'match', 'emptymatch')   % Result = {}
regexp('', expr2, 'match', 'emptymatch')    % Result = {''}

expr3 = '^b?$';
regexp('a', expr3, 'match', 'emptymatch')   % Result = {}
regexp('b', expr3, 'match', 'emptymatch')   % Result = {'b'}
regexp('', expr3, 'match', 'emptymatch')    % Result = {''}

expr5 = '^.*$';
regexp('b', expr5, 'match', 'emptymatch')   % Result = {'b'}
regexp('', expr5, 'match', 'emptymatch')    % Result = {''}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...