MATLAB regexp - возвращать каждый экземпляр в шаблоне с неизвестным числом вхождений, используя 'names' - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь получить каждую цифру из шаблона с помощью регулярных выражений.Сложность в том, что мне нужно использовать аргумент 'names', а количество цифр / полей неизвестно.

Например, я хочу сопоставить цифры в '[10,20,30]' с regexp(...,'names') таким образом, чтобына выходе получается структура с полями 'val1','val2','val3' (со значениями 10,20 и 30).

Примерно так:

>> match = regexp('[10,20,30]',expr,'names');
>> match.val1
    10
>> match.val2
    20

Знаете ли вы какой-либо способ воспроизвести что-то вроде

match = regexp('[1,2,3]','^\[(?< val1>\d+),(?< val2>\d+),(?< val3>\d+)\]$','names');

но динамически, чтобы захватить любое число (> 0) цифр в шаблоне?


РЕДАКТИРОВАТЬ: Чтобы уточнить, я хочу проверитьpattern (цифры отделяются запятой внутри предложения в квадратных скобках, больше ничего) и возвращают цифры в том же вызове регулярного выражения.

Я мог бы использовать два вызова;сначала проверяя шаблон, а затем возвращая цифры.

Однако мой код ожидает один звонок.Для тех, кто заинтересован, я хочу получить больше от объекта inputParser и создать свой собственный вариант для него.У меня есть массив допустимых атрибутов для разных классов.Я хочу, чтобы один из них был размером входного аргумента, используя атрибут 'size[3,4]' или 'size[3,4,2]' или любое другое измерение.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Некоторое время отдыха часто помогает!expr = '(?<=^\[(\d+,)*)(\d+)(?=(,\d+)*\]$)'; добьется цели, если вы проигнорируете мой запрос выходного формата.

'(?<=^\[(\d+,)*) проверяет первую скобку [, за которой следуют любые цифры, разделенные ,.

'(\d+) захватывает любую цифру

'(?=(,\d+)*\]$)' проверяет следующие цифры, разделенные , и, наконец, заканчивается ].

>> expr = '(?<=^\[(\d+,)*)(\d+)(?=(,\d+)*\]$)';
>> str1 = '(1,2,3]'; % -> empty
>> str2 = '[1,2,3]'; % -> {'1', '2', '3'}

>> regexp(str1,expr)
ans =
  0×0 empty cell array

>> regexp(str2,expr)
ans =
  1×3 cell array
    {'1'}    {'2'}    {'3'}

Это и то, и другоепроверяет шаблон и фиксирует любое количество цифр в шаблоне в одном вызове регулярного выражения.

Затем, используя аргумент 'names', они сохраняются в структуре.Однако, как отметил @Sam Roberts, все цифры хранятся в одном поле.Не так, как я впервые задал вопрос.Это, однако, не важно для меня, одно поле со всеми значениями в порядке.

0 голосов
/ 14 февраля 2019

Не совсем так работает опция names.Он не даст вам структуру с полями с разными именами, такими как val1, val2 и т. Д. Он даст вам массив структур, каждый с полем val.

Например:

>> str = '[10,20,30]';
>> expr = '(?<val>[0-9]*)*';
>> vals = regexp(str, expr, 'names')
vals = 
  1×3 struct array with fields:
    val
>> vals(1).val
ans =
    '10'
>> vals(3).val
ans =
    '30'

Если вы хотите, вы можете впоследствии манипулировать этим в единую структуру с полями val1, val2 и т. Д. Но я думаю, что это, вероятно, будет менее удобно, чем массив структуры vals, который вы уже использовали.есть.

...