MATLAB regexp-使用“名称”

时间:2019-02-13 21:41:24

标签: regex matlab dynamic

我正在尝试使用正则表达式从模式中获取每个数字。困难的一点是我需要使用“名称”参数,并且位数/字段的数量未知。

例如我想将'[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)?


编辑: 为了明确起见,我想验证模式(方括号子句中用逗号分隔的数字,别无其他),并在相同的regexp调用中返回数字。

我可以打两个电话;首先验证模式,然后返回数字。

但是,我的代码需要一个电话。对于那些感兴趣的人,我想要更多的inputParser对象,并为其创建自己的变体。我有一个有效的属性数组,用于不同的类。我希望使用属性'size[3,4]''size[3,4,2]'或任何其他尺寸,将其中之一作为输入参数的大小。

2 个答案:

答案 0 :(得分:2)

这不是names选项的工作方式。它不会为您提供具有val1val2等不同名称的字段的结构。它将为您提供一个结构数组,每个结构都具有一个字段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'

如果愿意,可以随后将其操作为具有字段val1val2等的单个结构。但是我想这可能不如结构数组vals方便你已经有。

答案 1 :(得分:0)

请假有时会有所帮助!如果您无视我对输出格式的要求,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'}

这既可以验证模式,又可以在一个regexp调用中捕获模式中的任何数字。

然后,使用'names'参数将它们存储在结构中。但是,正如@Sam Roberts指出的那样,所有数字都存储在一个字段中。不像我在问题中首先问到的。但是,这对我而言并不重要,一个具有所有值的字段就可以了。