4

我有一组字符串(总共几千个)我需要解析如下所示:

'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

但结果似乎不一致:输出=

22    21
 4     2
85   572
 3     1
 6    58

字母 =

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

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

4

3 回答 3

1

这里的关键是用而不是仅仅指定个或一个单词字符。正如我在评论中所说,这意味着您可以更新为,\w?\wtest

test='(\d*)-(\d*)(\w?)-.*';
于 2013-10-11T21:43:11.397 回答
1

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

(\d+)-(\d+)([a-zA-Z])?.*
于 2013-10-11T22:45:42.223 回答
0

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

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

The?是另一个量词(除了+and之外*),意思是“零或一”。

我也在试图为你的正则表达式的行为找到一个解释,但很难说。它可能与(\d*)+您在哪里对原子进行乘法量化有关,当然也与某种回溯有关。如果我弄清楚了,我会编辑我的答案。

于 2013-10-11T21:41:11.560 回答