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'

最初の数字 (数字ではない!)、2 番目の数字、および文字 (存在する場合) を別々に返したい:

'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

文字 =

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

正規表現がその 2 番目の数値の最初の桁のみを返すことがあるのはなぜですか? 最初の数字が 1 桁しかない場合に発生する可能性があると思っていましたが、最後の文字列は、1 桁を正しく解析する場合があることを証明しています。私は何が欠けていますか?

4

3 に答える 3

1

ここで重要なの\w?単に\w. コメントで述べたように、これは、次のように更新できることを意味しますtest

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

私の 2 セント (データが常に提供された形式である場合):

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