我有一组字符串(总共几千个)我需要解析它们看起来像这样:
'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位数时可能会发生这种情况,但最后一个字符串证明有时它会正确地解析单个数字。 我错过了什么?
答案 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*)+
之类的东西有关,在这些东西中,你可以对原子进行多次量化,当然还有某些回溯。如果我搞清楚的话,我会编辑我的答案。