我正在尝试使用正则表达式从模式中获取每个数字。困难的一点是我需要使用“名称”参数,并且位数/字段的数量未知。
例如我想将'[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]'
或任何其他尺寸,将其中之一作为输入参数的大小。
答案 0 :(得分:2)
这不是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
方便你已经有。
答案 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指出的那样,所有数字都存储在一个字段中。不像我在问题中首先问到的。但是,这对我而言并不重要,一个具有所有值的字段就可以了。