Matlab正则表达式与令牌的行为不一致

时间:2013-10-11 21:33:07

标签: regex matlab

我有一组字符串(总共几千个)我需要解析它们看起来像这样:

'22-213-1-0,0'
'4-23-1-1,0'
'85-572A-1-1,0'
'3-13-1-1,0'
'6-58A-1-1,0'

我希望第一个数字(不是数字!),第二个数字和字母(如果存在)单独返回:

'22' '213' ''
'4'  '23'  ''
'85' '572' 'A'
'3'  '13'  ''
'6'  '58'  'A' 

我使用正则表达式来执行此操作:

input = {'22-213-1-0,0' '4-23-1-1,0' '85-572A-1-1,0' '3-13-1-1,0' '6-58A-1-1,0'}'

test='(\d*)+[-]+(\d*)+(\w)+[-]\w*';

for i=1:length(input)

    parsedstring=regexp(input(i),test,'tokens');
    output(i,1)=cellfun(@str2num,parsedstring{1}{1}(1));
    output(i,2)=cellfun(@str2num,parsedstring{1}{1}(2));
    letter(i)=parsedstring{1}{1}(3);
end

但结果似乎不一致: output =

22    21
 4     2
85   572
 3     1
 6    58

letter =

'3'    '3'    'A'    '3'    'A'

为什么regexp有时只返回第二个数字的第一个数字?我认为当第一个数字只有1位数时可能会发生这种情况,但最后一个字符串证明有时它会正确地解析单个数字。 我错过了什么?

3 个答案:

答案 0 :(得分:1)

此处的关键是使用\w?指定zero or one字符,而不只是\w。正如我在评论中所说,这意味着您可以将test更新为

test='(\d*)-(\d*)(\w?)-.*';

答案 1 :(得分:1)

我的2美分(如果您的数据始终采用您提供的格式):

(\d+)-(\d+)([a-zA-Z])?.*

答案 2 :(得分:0)

首先尝试使用锚点 ^。此外,这是一个更简单的表达式:

^(\d+)-(\d+)(\w?)-

?是另一个量词(除了+*),表示“零或一个”。

我也试图找到你的正则表达式行为的解释,但很难说。它可能与像(\d*)+之类的东西有关,在这些东西中,你可以对原子进行多次量化,当然还有某些回溯。如果我搞清楚的话,我会编辑我的答案。