我在MATLAB中有一串像'12hjb42&34ni3&(*&'
这样的字符。
我想通过正则表达式或其他更简单的方法将数字和字母以及其他所有内容分开。我怎么能这样做?
答案 0 :(得分:9)
我认为使用函数ISSTRPROP:
会更容易,而不是使用正则表达式str = '12hjb42&34ni3&(*&'; %# Your sample string
alphaStr = str(isstrprop(str,'alpha')); %# Get the alphabetic characters
digitStr = str(isstrprop(str,'digit')); %# Get the numeric characters
otherStr = str(~isstrprop(str,'alphanum')); %# Get everything that isn't an
%# alphanumeric character
哪会给你这些结果:
alphaStr = 'hjbni'
digitStr = '1242343'
otherStr = '&&(*&'
如果您真的想要使用REGEXP,那么您可以这样做:
matches = regexp(str,{'[a-zA-Z]','\d','[^a-zA-Z\d]'},'match');
alphaStr = [matches{1}{:}];
digitStr = [matches{2}{:}];
otherStr = [matches{3}{:}];
答案 1 :(得分:0)
我不认为正则表达式可以处理这个,除非你知道你提前有多少个/ string / else块。例如,在'st34 *'中有3个块,所以这可以工作:
regexprep('st34*', '([A-Za-z]+|\d+|\W+)([A-Za-z]+|\d+|\W+)([A-Za-z]+|\d+|\W+)', ...
'$1 $2 $3')
如果您不知道块的数量,可以将int和bucket转换为3个类别,然后查看类别更改的位置以找到断点。
n = int32('st34a');
idx = zeros(size(n));
idx(ismember(n, int32('0'):int32('9'))) = 1;
idx(ismember(n, int32('a'):int32('z'))) = 2;
idx(ismember(n, int32('A'):int32('Z'))) = 2;
idx = diff(idx) ~= 0; % these are the breakpoints where your string changes type
我没有对此进行测试,但这样的事情应该可行。